题目链接:https://vjudge.net/problem/UVA-247
水题,Floyd跑一遍,找双向联通的直接输出就好。
/*
* @Author: SamsonHo
* @Date: 2018-10-16-21.46.03
* @URL:https://vjudge.net/problem/UVA-247
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
int a[30][30];
string n1,n2;
int main(void)
{
int n,m,u,v,kase = 0;
while(~scanf("%d%d",&n,&m) && n+m)
{
memset(a,0,sizeof a);
int cnt = 0,vis[30] = {0};
map<string,int> name;
map<int,string> num;
for(int i = 1; i <= m; ++i)
{
cin>>n1>>n2;
if(!name[n1])
name[n1] = ++cnt,num[cnt] = n1;
if(!name[n2])
name[n2] = ++cnt,num[cnt] = n2;
a[name[n1]][name[n2]] = 1;
}
for(int k = 1; k <= cnt; ++k)
{
for(int i = 1; i <= cnt; ++i)
{
for(int j = 1; j <= cnt; ++j)
{
if(!a[i][j] && a[i][k] && a[k][j])
a[i][j] = 1;
}
}
}
if(kase) puts("");
printf("Calling circles for data set %d:\n",++kase);
for(int i = 1; i <= cnt; ++i)
{
bool flag = false;
if(vis[i]) continue;
cout<<num[i];
vis[i] = 1;
for(int k = 1; k <= cnt; ++k)
{
if(!vis[k] && a[i][k] && a[k][i])
{
flag = true;
vis[k] = 1;
cout<<", "<<num[k];
}
}
puts("");
}
}
}