10044

#include <iostream>
#include <string.h>
#include <string>
#include <vector>
#include <cstdio>
#include <map>

#define ll long long
#define MAX_WORD 105
#define INF 100000000

using namespace std;

int min_arr[1000001];
map<string,int> nameErdos;


int minval(string **vb,int i)
{
	int v = nameErdos[0]];

	for(int j=1;vb[i][j]!="END";j++)
	{
		v = min(v,nameErdos[j]]);
	}
	return v;
}


int main()
{

	int t,P,N,MN;
	int kase=1;
	string name="",ss,trash;
	char c;
	bool coma,found=false;

	cin>>t;

	while(t--)
	{
		cin>>P>>N;
		int cnt =0;

		memset(min_arr,INF,sizeof(min_arr));
		nameErdos.clear();
		string **vb = new string *[P];
		while(cnt!=P)
		{
			name="";
			int index =0;
			MN = INF;
			coma =0;
			found=false;
			vb[cnt] = new string[MAX_WORD];

			while(cin>>c && c!=':')
			{
				if(c==',')
				{
					if(coma==0)
					{
						coma =1;
						name.append(1u,c);
						name.append(1u,' ');
						continue;
					}
					if(coma)
					{
						coma = 0;
						vb[cnt][index++]=name;
						if(name=="Erdos, P.")
						{
							nameErdos[name]=1;
							MN =1;
							found=1;
						}
						if(nameErdos[name]==0)
						{
							nameErdos[name]=INF;
						}
						if(nameErdos[name]<MN)
						{
							MN = nameErdos[name];
						}
						name ="";
					}
				}
				else if(c==' ')
				continue;
				else
				name.append(1u,c);
			}//2nd while

			vb[cnt][index++]=name;
			if(name=="Erdos, P.")
			{
				nameErdos[name]=1;
				MN =1;
				found=1;
			}
			if(nameErdos[name]==0)
			{
				nameErdos[name]=INF;
			}
			if(nameErdos[name]<MN)
			{
				MN = nameErdos[name];
			}
			name ="";
			getline(cin,trash);

			if(found)
			{
				for(int i=0;i<index;i++)//vb[cnt].size()
				{
					nameErdos[i]]= 1;
					if(vb[cnt][i]=="Erdos, P.")
						nameErdos[i]]= 0;
				}
				min_arr[cnt]=1;
			}
			else
			{
				for(int i=0;i<index;i++)//vb[cnt].size()
				{
					if(nameErdos[i]]>MN)
						nameErdos[i]] = MN+1;
				}
				min_arr[cnt]=MN;
			}

			vb[cnt][index]="END";
			cnt+=1;
			MN = INF;
		}//1st while

		int Isfinished = 0;
		while(!Isfinished)
		{
			Isfinished =1;
			int val;
			for(int i=0;i<cnt;i++)
			{
				val = minval(vb,i);
				for(int j=0;;j++)
				{
					if(vb[i][j]=="END")
					break;
					if(nameErdos[j]]!=val+1 && nameErdos[j]]!=val)
					{
						nameErdos[j]] = val+1;
						Isfinished = 0;
					}
				}
			}
		}
		//cout<<"out\n";
		bool line=1;
		for(int i=0;i<N;i++)
		{
			getline(cin,ss);
			if(line)
			cout<<"Scenario "<<kase++<<"\n";
			line = false;
			if(nameErdos[ss]>=INF)
			cout<<ss<<" "<<"infinity\n";
			else if(nameErdos[ss]==0 && ss!="Erdos, P.")
			cout<<ss<<" "<<"infinity\n";
			else
			cout<<ss<<" "<<nameErdos[ss]<<"\n";
		}
	}//t while

	return 0;
}

Leave a Reply

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