https://odzkskevi.qnssl.com/e5b6ab93e015ed7080742eadac1fbd1e?v=1534041987
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
char name1[30],name2[30];
int n,m,d[25][25],vis[30];
vector<string>t;
int getID(string p){
for(int i=0;i<t.size();i++){
if(t[i]==p)
return i;
}
t.push_back(p);
return t.size()-1;
}
void Floyd(){//用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]);
}
}
}
}
void print(int u){
vis[u]=1;
for(int i=0;i<n;i++){
if(!vis[i]&&d[u][i]&&d[i][u]){
printf(", %s",t[i].c_str());
print(i);
}
}
}
int main(){
int cnt=0;
while(~scanf("%d%d",&n,&m)){
if(!n&&!m)
break;
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
t.clear();
for(int i=0;i<m;i++){
scanf("%s %s",name1,name2);
d[getID(name1)][getID(name2)]=1;
}
Floyd();
if(cnt>0)
printf("\n");
printf("Calling circles for data set %d:\n",++cnt);
for(int i=0;i<n;i++){
if(!vis[i]){
printf("%s",t[i].c_str());
print(i);
printf("\n");
}
}
}
return 0;
}