题目大意: 电话圈组成,回路判断问题
解题思路: 转化字符串以后,用五行Floyd判断包闭
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
#define maxn 50
int map[maxn][maxn],n,m;
int vis[maxn];
char name[maxn][50];
int charge(char *s)
{
int i;
for(i=0;i<m;i++)
if(strcmp(name[i],s)==0)return i;
if(i==m)
{
strcpy(name[m],s);m++;
return m-1;
}
}
void dfs(int u)
{
vis[u]=1;
for(int i=0;i<n;i++)
if(map[u][i]==1&&map[u][i]==map[i][u])
{
if(vis[i]==0)
{
cout<<", "<<name[i];
dfs(i);
}
}
}
int main()
{
int Case=1;int bian;
while(~scanf("%d%d",&n,&bian)&&n!=0&&bian!=0)
{
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
char start[50],finish[50],str1[50],str2[50];
cin>>start>>finish;
strcpy(name[0],start);strcpy(name[1],finish);m=2;
map[0][1]=1;
int x,y;
for(int i=0;i<bian-1;i++)
{
cin>>str1>>str2;
x=charge(str1);y=charge(str2);
map[x][y]=1;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(map[k][j]==1&&map[i][k]==1)map[i][j]=1;
/*
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
cout<<map[i][j]<<" ";
}
cout<<endl;
}
*/
cout<<endl;
cout<<"Calling circles for data set "<<Case<<":"<<endl;
Case++;
for(int i=0;i<n;i++)
{
if(vis[i]==0)
{
cout<<name[i];
dfs(i);
cout<<endl;
}
}
}
return 0;
}