关闭

Erdos Numbers

350人阅读 评论(0) 收藏 举报
分类:

题目大意:

给出P个栏目

每个栏目分别由几个作者一起出版,输入的方式为:

作者名1,作者姓1.作者名2,作者姓2 ……作者名n,作者姓n

每个栏目的作者之间有关系

给出N个询问

每个询问输入的为

作者名,作者姓。问通过几层关系,能找到“Erdos, P.”这个人,若能查到则输出“作者名,作者姓:(关系数目)”,若不能查到,则输出“作者名,作者姓: infinity\n”

题目思路:


当两个作者有关系,那么就连上一条双向边。然后从“Erdos, P.”这个人为起点开始BFS,记录下到能到的点(即其他作者)的最短路,有关系的属于同一层。

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
#define N 10100
#define M 1000010

map<string,int> s;
vector<int> g[N];
char name[N];
int p,n;
int author[N*4];
int id;
int vis[N*10];
int work[N];

struct node
{
	int point;
	int step;
	void in(int _point,int _step)
	{
		point = _point;
		step = _step;
	}
}q[M];

void create_map()
{
	s.clear();
	strcpy(name,"Erdos, P.");
	string t;
	t = name;
	s[t] = 1;//这是第一个货的名字
	for(int i = 0 ; i < p ; i ++ )
	{
		int edgenum = 0;
		int flag = 1;
		while(1)
		{
			scanf("%s",name);
			t = name;
			name[0] = ' ';
			scanf("%s",name+1); 
			int len = strlen(name);
			if(name[len-1] == ':' || name[len-1] == '.')
				flag = 0;
			name[len-1] = '\0';
			t += name;
			if( s[t] == 0 )
				s[t] = ++id;
			author[edgenum ++] = s[t];    //加入paper[]
			if(!flag)
			{
				gets(name);    
				break;
			}
		}//输入作者名字神马的

		for(int u = 0 ; u < edgenum ; u ++ )
		{
			for(int v = 0 ; v < edgenum ; v ++ )
			{
				if( u == v )
					continue;
				g[author[u]].push_back(author[v]);
			}
		}
	}
}

void bfs()
{
	int h = 0 , t = 1;
	q[h].in(1,1);
	vis[1] = 1;
	while( h < t )
	{
		node temp = q[h++];
		int u = temp.point;
		for(int i = 0 ; i < g[u].size() ; i ++ )
		{
			int v = g[u][i];
			if( vis[v] )
				continue;
			work[v] = temp.step;
			q[t ++].in(v,work[v] + 1);
			vis[v] = 1;
		}
	}
}

int main()
{
	int kas = 0;
	//freopen("e://in.txt","r",stdin);
	while(scanf("%d%d",&p,&n)!=EOF)
	{
		id = 1;
		if( p == 0 && n == 0 )
			break;
		for(int i = 0 ; i < N; i ++ )
			g[i].clear();
		create_map();
		memset(vis,0,sizeof(vis));
		memset(work,0,sizeof(work));
		bfs();
		printf("Database #%d\n",++kas);
		for(int i = 0 ; i < n ; i ++ )
		{
			scanf("%s",name);
			printf("%s",name);
			string t = name;
			name[0] = ' ';
			scanf("%s",name + 1);
			printf("%s",name);
			t += name;
			if( work[s[t]] )
				printf(": %d\n",work[s[t]]);
			else
				printf(": infinity\n");
		}
		printf("\n");
	}
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6874次
    • 积分:261
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条