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 }

浙公网安备 33010602011771号