hdu 3172 Virtual Friends (字符串的并查集)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 3172 Virtual Friends (字符串的并查集)相关的知识,希望对你有一定的参考价值。

一开始一直wa,因为第一个数字t也是多组输入。

然后一直超时,因为我用的是C++里面的cin,所以非常耗时,几乎比scanf慢了10倍,但是加上了一个语句后:

std::ios::sync_with_stdio(false);                //是用来禁用cin这个兼容性的特性,禁用后就相差无几了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <map>
 5 #include <string>
 6 #include <algorithm>
 7 using namespace std;
 8 map<string, string>fa;
 9 map<string, int>Rank;
10 const int maxn = 100005;
11 string a[maxn];
12 string b[maxn];
13 
14 string Find(string x){
15     if (x == fa[x])
16         return x;
17     else
18         return fa[x] = Find(fa[x]);
19 }
20 
21 void set_union(string x, string y){
22     string xx = Find(x);
23     string yy = Find(y);
24     //cout << "fa: " << xx << " " << yy << endl;
25     if (xx == yy){
26         cout << Rank[xx] << endl;
27     }
28     else{
29         fa[yy] = xx;
30         Rank[xx] += Rank[yy];
31         cout << Rank[xx] << endl;
32     }
33     /*
34     if (Rank[xx] > Rank[yy]){
35         fa[yy] = xx;
36         Rank[xx] += Rank[yy];
37         cout << Rank[xx] << endl;
38     }
39     else if (Rank[xx]==Rank[yy]){
40         fa[yy] = xx;
41         Rank[xx]+=Rank[yy];
42         cout << Rank[xx] << endl;
43     }
44     else{
45         fa[yy] = xx;
46         Rank[yy] += Rank[xx];
47         cout << Rank[yy] << endl;
48     }
49     */
50 }
51 
52 void init(int sum){
53     for (int i = 0; i < sum; i++){
54         fa[a[i]] = a[i];
55         fa[b[i]] = b[i];
56         Rank[a[i]] = Rank[b[i]] = 1;
57     }
58 }
59 
60 int main(){
61     std::ios::sync_with_stdio(false);
62     int t;
63     while (cin>>t){
64         while (t--){
65             int n;
66             cin >> n;
67             for (int i = 0; i < n; i++){
68                 cin >> a[i];
69                 cin >> b[i];
70             }
71             init(n);
72             for (int i = 0; i < n; i++){
73                 //cout << "#" << i << endl;
74                 //cout << a[i] << " " << b[i] << endl;
75                 set_union(a[i], b[i]);
76             }
77         }
78     }
79     //system("pause");
80     return 0;
81 }

 

以上是关于hdu 3172 Virtual Friends (字符串的并查集)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3172 Virtual Friends (map+并查集)

HDU3172 Virtual Friends

HDU - 3172Virtual Friends(带权并查集--权为集合元素个数)

hdu 3172 Virtual Friends (字符串的并查集)

HDU Virtual Friends(超级经典的带权并查集)

Kattis - Virtual Friends