利用map的特性进行编号,然后利用floyd求出传递闭包,最后又用到DFS进行输出,每一步都很重要。
#include<stdio.h>
#include<map>
#include<string>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
int n,m,cas=1;
map<string,int>name;
int f[30][30];
int vis[30];
vector<string>Name;
void dfs(int u)
{
vis[u]=1;
for(int i=0;i<n;i++)
if(f[u][i]&&f[i][u]){
if(!vis[i]){
cout<<", "<<Name[i];
dfs(i);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
name.clear();
Name.clear();
memset(f,0,sizeof f);
memset(vis,0,sizeof vis);
// if(cas>1) puts("");
int id=0;
if(n==0&&m==0) break;
for(int i=0;i<m;i++){
string a,b;
cin>>a>>b;
if(!name.count(a))
{
name[a]=id++;
Name.push_back(a);
}
if(!name.count(b))
{
name[b]=id++;
Name.push_back(b);
}
int x=name[a],y=name[b];
f[x][y]=1;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
f[i][j]=(f[i][j]||(f[i][k]&&f[k][j]));
if(cas>1)
cout<<endl;
cout<<"Calling circles for data set " << cas++ <<":" << endl;
for(int i=0;i<n;i++){
if(!vis[i]){
cout<<Name[i];
dfs(i);
cout<<endl;
}
}
}
return 0;
}