欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ 1391 Erdos Numbers G++ bfs

程序员文章站 2022-03-23 17:33:13
...

POJ 1391 Erdos Numbers G++ bfs

POJ 1391 Erdos Numbers G++ bfs

POJ 1391 Erdos Numbers G++ bfs

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
using namespace std;
//英语     看博友分析    抄博友程序     bfs  
map<string,int> mp;
vector<int> g[10000];
int dis[10000];
int main()
{
	int tag=0;
	while(1)
	{
		tag++;
		int n,m;
		cin>>n>>m;
		if(n==0 && m==0)
		{
			break;
		}
		cout<<"Database #"<<tag<<endl;
		for(int i=0;i<10000;i++)
		{
			g[i].clear();
		}
		mp.clear();
		memset(dis,-1,sizeof(dis));
		int js=1;
		mp["Erdos,P."]=js++;
		//cout<<"Erdos,P."<<"* "<<mp["Erdos,P."]<<endl;
		while(n--)
		{
			vector<int> ve;
			ve.clear();			
			while(1)
			{
				string a,b;
				char str[100];
				//cin>>a;
				//cin>>b;				
				scanf("%s",str);
				a=str;
				scanf("%s",str);
				b=str;
				int l=b.size();
				int flag=0;
				if(b[l-1]==':'||b[l-1]=='.')//抄博友程序 
				{
					flag=1;
				}
				//b[l-1]='\0';
				b.erase(b.begin()+l-1);
				//cout<<b<<"*"<<endl;
				string s=a+b;
				//cout<<s<<"* ";
				if(mp[s]==0)
				{
					mp[s]=js++;
				}
				//cout<<mp[s]<<endl;
				ve.push_back(mp[s]);
				if(flag==1)
				{
					//cout<<"hi"<<endl;
					//for(int i=0;i<ve.size();i++)
					//{
					//	cout<<ve[i]<<" ";
					//}
					//cout<<endl;
					char t[1000];
					gets(t);
					for(int i=0;i<ve.size();i++)
					{
						for(int j=0;j<ve.size();j++)
						{
							if(i!=j)
							{
								//cout<<ve[i]<<" "<<ve[j]<<endl;
								g[ve[i]].push_back(ve[j]);
								g[ve[j]].push_back(ve[i]);
							}
						}
					}
					break;
				}
			}
		}
		queue<int> que;
		que.push(1);
		dis[1]=0;
		while(que.empty()!=1)
		{
			int u=que.front();
			que.pop();
			for(int i=0;i<g[u].size();i++)
			{
				int v=g[u][i];
				if(dis[v]==-1)
				{
					dis[v]=dis[u]+1;
					que.push(v);
				}
			}
		}
		while(m--)
		{
			char str[100];
			string a,b;
			//cin>>a>>b;
			scanf("%s",str);
			a=str;
			scanf("%s",str);
			b=str;
			cout<<a<<" "<<b<<": ";
			int l=b.size();
			//b[l-1]=0;
			//b.erase(b.begin()+l-1);
			string s=a+b;
			//cout<<s<<"* "<<mp[s]<<endl;
			if(dis[mp[s]]==-1)
			{
				cout<<"infinity"<<endl;
			}else
			{
				cout<<dis[mp[s]]<<endl;
			}
		} 
		cout<<endl;//抄博友程序 
	}
	return 0;
}