1388:家谱(gen)

http://ybt.ssoier.cn:8088/problem_show.php?pid=1388

方法一:普通模拟,结构体写法

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 struct node
 6 {
 7     string name;
 8     int father;
 9 };
10 node a[50009];
11 int findx(int i)
12 {
13     if(a[i].father!=i)a[i].father=findx(a[i].father);
14     return a[i].father;
15 }
16 void unionn(int r,int t)
17 {
18     int q=findx(t);
19     if(r!=q)a[q].father=r;
20 }
21 int main()
22 {
23     char c;
24     int tot=0;
25     int father;
26     string s;
27     do
28     {
29         cin>>c;
30         if(c=='$')break;
31         cin>>s;
32         int r=-1;
33         for(int i=1;i<=tot;i++)
34             if(a[i].name==s)
35             {
36                 r=i;
37                 break;\\找到就可以跳出;
38             }    
39         if(r==-1)
40         {
41             r=++tot;
42             a[r].father=r;
43             a[r].name=s;
44         }    
45         if(c=='#')
46         {
47             father=a[r].father;
48             continue;
49         }    
50         if(c=='+')
51         {
52             unionn(father,r);
53             continue;
54             }    
55         if(c=='?')
56             cout<<s<<" "<<a[findx(r)].name<<endl;
57     }while(1);
58     return 0;
59 }

 

 

 

方法二:使用STL  MAP

 1     #include<iostream>
 2     #include<cstdio>
 3     #include<algorithm>
 4     #include<string>
 5     #include<map>
 6      
 7     using namespace std;
 8     map<string, string>p;
 9     string findth(string x)
10     {
11         if (p[x] == x) return x;
12         return p[x] = findth(p[x]);
13     }
14      
15     void unionn(string x, string y)
16     {
17         string xx = findth(x);
18         //string yy = findth(y);
19         if (xx != y) p[y] = xx;
20     }
21     int main()
22     {
23         string s;
24         string t;
25         string t1;
26         string t2;
27         while (cin >> s, s != "$") {
28             if (s[0] == '#') {
29                 t = s.substr(1);
30                 if (p[t] == "") p[t] = t;
31             }
32             else if (s[0] == '+') {
33                 t1 = s.substr(1);
34                 unionn(t, t1);
35             }
36             else if (s[0] == '?') {
37                 t2 = s.substr(1);
38                 findth(t2);//找到祖先
39                 cout << t2 << " " << p[t2] << endl;
40             }
41         }
42         return 0;
43     }

 

posted @ 2021-01-08 11:25  TFLSNOI  阅读(456)  评论(0编辑  收藏  举报