题目描述:https://vjudge.net/problem/UVA-247
//一开始还没想到用dfs输出答案,看了大佬的代码才想起来
#include <iostream>
#include <map>
#include <vector>
#include <cstdio>
#include <string>
#include <set>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=30;
int g[maxn][maxn];
bool vis[maxn];
vector <string> s;
map <string,int> mp;
int n,m;
void dfs(int u) {
vis[u]=1;
for(int i=0;i<n;i++) {
if(!vis[i]&&g[u][i]&&g[i][u]) {
cout << ", " <<s[i];
dfs(i);
}
}
}
int main() {
int kase=0;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m)) {
s.clear();
string a,b;
memset(vis,0,sizeof(vis));
memset(g,0,sizeof(g));
mp.clear();
for(int i=0;i<m;i++) {
cin >> a >> b;
int cnt=0;
if(!count(s.begin(),s.end(),a)){s.push_back(a);mp[a]=s.size()-1;}
if(!count(s.begin(),s.end(),b)){s.push_back(b);mp[b]=s.size()-1;}
g[mp[a]][mp[b]]=1;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);
}
printf("Calling circles for data set %d:\n",++kase);
for(int i=0;i<n;i++) {
if(!vis[i]) {
cout << s[i];
dfs(i);
cout <<endl;
}
}
}
return 0;
}