1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#include <iostream> #include <map> #include <string> #include <cstring> #define INF 1000000000 using namespace std; int gr[30][30]; map<string,int> mp; map<int,string> np; int visit[30]; int main() { int n,m,c=0; int kase = 1; string s1,s2; while(cin>>n) { cin>>m; if(n+m==0) break; for(int i=0;i<26;i++) { for(int j=0;j<26;j++) { if(i==j) gr[i][j]=0; else { gr[i][j]=INF; } } } mp.clear(); np.clear(); int K=1; for(int i=0;i<m;i++) { cin>>s1>>s2; if(mp[s1]==0) { mp[s1]=K; np[K]=s1; K++; } if(mp[s2]==0) { mp[s2]=K; np[K]=s2; K++; } gr[mp[s1]][mp[s2]]=1; //gr[mp[s2]][mp[s1]]=1; } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(gr[i][k]!=INF && gr[k][j]!=INF) gr[i][j]=1; } } } if(c) cout<<"\n"; c=1; cout<<"Calling circles for data set "<<kase++<<":\n"; memset(visit,false,sizeof(visit)); int total =n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(gr[i][j]==INF) gr[j][i]=INF; } } for(int i=1;i<=n;i++) { bool first=true; for(int j=1;j<=n;j++) { if(gr[i][j]!=INF) { if(visit[j]==0) { if(first) { cout<<np[j]; first =false; } else { cout<<", "<<np[j]; } visit[j]=1; } } } if(!first) cout<<"\n"; } } return 0; } |