uva247-Calling Circles-Floyd算法

来源:互联网 发布:开淘宝怎么上传宝贝 编辑:程序博客网 时间:2024/05/18 00:00

题意:求出每个电话圈里的人。

思路:Floyd, dfs,同时STL存。

代码:

#include <bits/stdc++.h>using namespace std;map<string,int> mp; //给每个名字编号vector<string> v; //存名字int d[30][30];int vis[30]; //判断是否扫过int n;void dfs(int i){    vis[i] = 1;    for (int j = 0; j<n; j++) {        if (d[i][j] && d[j][i] && !vis[j]) {                printf(", ");                cout << v[j];                dfs(j);          }    }}int main(){   int  m, times = 0;   string s1, s2;   while (scanf("%d%d", &n, &m) && n && m) {        int id = 0;        memset(d, 0, sizeof d);        memset(vis, 0, sizeof vis);        mp.clear();v.clear();       for (int i=0; i<m ;i++) {          cin >> s1 >> s2;          if (!mp.count(s1)) {            mp[s1] = id++;            v.push_back(s1);          }          if (!mp.count(s2)) {            mp[s2] = id++;            v.push_back(s2);          }          int x = mp[s1], y = mp[s2];          d[x][y] = 1; //s1 对 s2 为 1       }       //Floyd       for (int k=0; k<n; k++)          for (int i=0; i<n; i++)            for (int j=0; j<n; j++)               d[i][j] = d[i][j]||(d[i][k]&&d[k][j]); //传递闭包       if (times) puts("");       printf("Calling circles for data set %d:\n", ++times);       //dfs       for (int i=0; i<n; i++) {          if (!vis[i]) {                cout << v[i];                dfs(i);                puts("");          }       }   }    return 0;}


0 0
原创粉丝点击