247

#include <iostream>
#include <map>
#include <string>
#include <cstring>

#define INF 1000000000

using namespace std;

int gr[30][30];
map<string,int> mp;
map<int,string> np;
int visit[30];

int main()
{
	int n,m,c=0;
	int kase = 1;
	string s1,s2;

	while(cin>>n)
	{
		cin>>m;

		if(n+m==0)
		break;
		for(int i=0;i<26;i++)
		{
			for(int j=0;j<26;j++)
			{
				if(i==j)
				gr[i][j]=0;
				else
				{
					gr[i][j]=INF;
				}
			}
		}

		mp.clear();
		np.clear();
		int K=1;
		for(int i=0;i<m;i++)
		{
			cin>>s1>>s2;
			if(mp[s1]==0)
			{
				mp[s1]=K;
				np[K]=s1;
				K++;
			}
			if(mp[s2]==0)
			{
				mp[s2]=K;
				np[K]=s2;
				K++;
			}

			gr[mp[s1]][mp[s2]]=1;
			//gr[mp[s2]][mp[s1]]=1;
		}

		for(int k=1;k<=n;k++)
		{
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
				{
					if(gr[i][k]!=INF && gr[k][j]!=INF)
					gr[i][j]=1;
				}
			}
		}
		if(c)
		cout<<"\n";
		c=1;
		cout<<"Calling circles for data set "<<kase++<<":\n";
		memset(visit,false,sizeof(visit));
		int total =n;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(gr[i][j]==INF)
				gr[j][i]=INF;
			}
		}
		for(int i=1;i<=n;i++)
		{
			bool first=true;
			for(int j=1;j<=n;j++)
			{
				if(gr[i][j]!=INF)
				{
					if(visit[j]==0)
					{
						if(first)
						{
							cout<<np[j];
							first =false;
						}
						else
						{
							cout<<", "<<np[j];
						}
						visit[j]=1;
					}
				}
			}
			if(!first)
			cout<<"\n";
		}

	}

	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *