UVA247 电话圈 Calling Circles
算法
floyed+传递闭包
代码
#include<bits/stdc++.h> using namespace std; map<string,int>mp; string st[30]; string st1,st2; bool g[30][30]; bool used[30]; int sum; int n,m; int T; int main() { cin>>n>>m; while(1) { sum=0; T++; //cout<<T<<endl; memset(g,0,sizeof(g)); memset(used,0,sizeof(used)); mp.clear(); for(int i=1;i<=m;i++) { cin>>st1>>st2; if(!mp[st1]) { mp[st1]=++sum; st[sum]=st1; } if(!mp[st2]) { mp[st2]=++sum; st[sum]=st2; } g[mp[st1]][mp[st2]]=1;//map存字符串 } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { g[i][j]=g[i][j] || (g[i][k] && g[k][j]);//floyed传递闭包 } } } printf("Calling circles for data set %d:\n",T); /*for(int i=1;i<=n;i++) cout<<st[i]<<" ";cout<<endl;*/ for(int i=1;i<=n;i++) { if(!used[i]) { cout<<st[i]; used[i]=1; for(int j=1;j<=n;j++) { if(g[i][j]&&g[j][i]&&!used[j]) { cout<<", "<<st[j]; used[j]=1; } } cout<<endl;//输出每一个电话圈(集合) } } cin>>n>>m; if(n||m)cout<<endl; else break; } return 0; }
细雨斜风作晓寒,
淡烟疏柳媚晴滩。
入淮清洛渐漫漫。
雪沫乳花浮午盏,
蓼茸蒿笋试春盘。
人间有味是清欢。