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
|
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<list> #include<cmath> #include<string> #include<sstream> #include<ctime> using namespace std; #define _PI acos(-1.0) #define esp 1e-9 #define INF 0x3f3f3f3f
#define MAXD 25 + 1
int n,m; map<string,int>name; vector<string>Name; int G[MAXD][MAXD],id; int vis[MAXD];
void init() { name.clear(); Name.clear(); id = 0; memset(vis, 0, sizeof(vis)); memset(G, 0, sizeof(G)); }
void floyd() { for(int k = 0; k < n; k++){ for(int i = 0; i < n; i++){ if(G[i][k]){ for(int j = 0; j < n; j++){ if(G[k][j]){ G[i][j] = 1; } } } } } }
void dfs(int sta) { vis[sta] = 1; for(int i = 0; i < n; i++){ if(G[sta][i] && G[sta][i] == G[i][sta]){ if(!vis[i]){ cout << ", " << Name[i]; dfs(i); } } }
}
int main() { int Case = 1; while(cin >> n >> m && (n || m)){ init(); for(int i = 0; i < m; i++){ string s1, s2; cin >> s1 >> s2; if(!name.count(s1)){ name[s1] = id++; Name.push_back(s1); } if(!name.count(s2)){ name[s2] = id++; Name.push_back(s2); } int x = name[s1], y = name[s2]; G[x][y] = 1; } floyd(); if(Case > 1) cout << endl; cout << "Calling circles for data set " << Case++ <<":" << endl; for(int i = 0; i < n; i++){ if(!vis[i]){ cout << Name[i]; dfs(i); cout << endl; } } } return 0; }
5 6 A B B A C A A C D E E D
A, B, C D, E */
|