Erdos Numbers

原创 2013年12月06日 12:24:30

题目大意:

给出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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UVa Problem 10044 Erdos Numbers (Erdos 数)

// Erdos Numbers (Erdos 数) // PC/UVa IDs: 110206/10044, Popularity: B, Success rate: low Level: 2 //...

UVa 10044 Erdos Numbers

#include #include #include #include #define MAXNAME 500 #define MAX 5000 #define INFINITY -1 ty...

poj 1391 Erdos Numbers

/* Name:poj 1391 Erdos Numbers Author: Unimen Date: 4/05/2011 16:51 Description:SPFA 最短路径*//*解题报...

UVa OJ 10044 - Erdos Numbers

这个题目我做的方法比较奇怪,我也说不上是什么算法,就当是深度优先吧。 对于每个人名都记录下他在哪一行输入出现过,每次这个人的erdos数值增加,就更新他出现的行数的其他人的erdos数值。然后递归调...

110206 Erdös Numbers ( Erdos Numbers )

#include #include #include #include #include #include #include using namespace std; #define...

10044-Erdos number Time limit exceeded

以下是我的代码,但是在通过uva测试是time limit exceeded, 不知道是什么原因,而且我自己测试了几个数据都是对的。 #include #include #include #incl...

Numbers Paul Hoffman

  • 2012-11-22 17:08
  • 13.40MB
  • 下载

LeetCode 2. Add Two Numbers(Java)

原题: You are given two non-empty linked lists representing two non-negative integers. The digits are...

magic house of numbers英文版

  • 2011-02-20 11:05
  • 7.28MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)