UVA 247 - Calling Circles Floyd闭包

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=183

题意&题解:

紫书P365

代码:

31 int n, m;
32 int d[MAXN][MAXN];
33 map<string, int> mmp;
34 string s[MAXN];
35 int par[MAXN];
36 
37 int find(int x) {
38     return par[x] = par[x] == x ? x : find(par[x]);
39 }
40 
41 void unite(int x, int y) {
42     int a = find(x), b = find(y);
43     if (a != b) par[a] = b;
44 }
45 
46 void init() {
47     mmp.clear();
48     memset(d, 0, sizeof(d));
49 }
50 
51 int main() {
52     ios::sync_with_stdio(false), cin.tie(0);
53     int cas = 1;
54     while (cin >> n >> m, n) {
55         init();
56         int cnt = 1;
57         while (m--) {
58             string a, b;
59             cin >> a >> b;
60             if (!mmp[a]) s[cnt] = a, mmp[a] = cnt++;
61             if (!mmp[b]) s[cnt] = b, mmp[b] = cnt++;
62             d[mmp[a]][mmp[b]] = 1;
63         }
64         rep(k, 1, n + 1) rep(i, 1, n + 1) rep(j, 1, n + 1)
65             if (d[i][k] && d[k][j]) d[i][j] = 1;
66         rep(i, 1, n + 1) par[i] = i;
67         rep(i, 1, n + 1) rep(j, 1, n + 1) if (d[i][j] && d[j][i]) unite(i, j);
68         if (cas != 1) cout << endl;
69         cout << "Calling circles for data set " << cas++ << ":" << endl;
70         rep(i, 1, n + 1) if (par[i] == i) {
71             cout << s[i];
72             rep(j, 1, n + 1) if (par[j] == i && j != i) cout << ", " << s[j];
73             cout << endl;
74         }
75     }
76     return 0;
77 }

 

posted @ 2017-08-24 12:32  Flowersea  阅读(194)  评论(0编辑  收藏  举报