Codeforces Round #464 (Div. 2) D Love Rescue(并查集)

必须使对应的字符在一个连通块中

最少需要多少条边能使每个连通块中的点连通?n-1,求和即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int fa[100005];
 4 void init()
 5 {
 6     for(int i=0;i<26;i++){
 7         fa[i]=i;
 8     }
 9 }
10 int get(int x)
11 {
12     if(x==fa[x]) return x;
13     else return get(fa[x]);
14 }
15 void _merge(int x,int y)
16 {
17     fa[get(x)]=get(y);
18 }
19 vector<int>a[26];
20 int main()
21 {
22     int n;
23     while(cin>>n)
24     {
25         for(int i=0;i<26;i++){
26             a[i].clear();
27         }
28         string s1,s2;
29         cin>>s1>>s2;
30         init();
31         for(int i=0;i<n;i++){
32             _merge(s1[i]-'a',s2[i]-'a');
33         }
34         for(int i=0;i<26;i++){
35             a[get(i)].push_back(i);
36         }
37         int ans=0;
38         for(int i=0;i<26;i++){
39             if(fa[i]==i&&a[i].size()>1){
40                 ans+=(a[i].size()-1);
41             }
42         }
43         cout<<ans<<endl;
44         for(int i=0;i<26;i++){
45             if(fa[i]==i){
46                 for(int j=0;j<a[i].size()-1;j++){
47                     printf("%c %c\n",a[i][j]+'a',a[i][j+1]+'a');
48                 }
49             }
50         }
51     }
52     return 0;
53 }

 

posted @ 2018-03-22 21:57  ghblw  阅读(136)  评论(0)    收藏  举报