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


(简单) 搜索 最短路 HOJ 1121 Erdos Numbers

Erdos NumbersMy Tags  (Edit)Source : ACM ICPC Mid-Central European 2000Time limit : 3 secMemory limi...
  • wsx1754175
  • wsx1754175
  • 2014年02月08日 09:51
  • 404

Bicoloring

这个是我在一个人的博客上看到的算法,用的是图和深度遍历算法。我自己照他的想法写了程序,发现是可以的。// Bicoloring.cpp : Defines the entry point for th...
  • Hilda_Chen
  • Hilda_Chen
  • 2010年10月29日 14:22
  • 477

Random Graph: Erdős–Rényi model

http://en.wikipedia.org/wiki/Erdos-Renyi_model One of their most surprising results is the existen...
  • lllcfr1
  • lllcfr1
  • 2013年09月13日 11:05
  • 1564

poj 1391 Erdos Numbers

/* Name:poj 1391 Erdos Numbers Author: Unimen Date: 4/05/2011 16:51 Description:SPFA 最短路径*//*解题报...
  • Unimen
  • Unimen
  • 2011年06月18日 18:36
  • 733

UVa Problem 10044 Erdos Numbers (Erdos 数)

// Erdos Numbers (Erdos 数) // PC/UVa IDs: 110206/10044, Popularity: B, Success rate: low Level: 2 //...
  • metaphysis
  • metaphysis
  • 2011年05月19日 15:31
  • 3026

How many fibs

// How Many Fibs.cpp : Defines the entry point for the console application. // #include "stdafx.h"...
  • Hilda_Chen
  • Hilda_Chen
  • 2010年10月15日 11:19
  • 364

UVa Problem Solution: 10044 - Erdos Number

The unclear specifications on the input format and size lead to the undeserving difficulties to solv...
  • liukaipeng
  • liukaipeng
  • 2008年11月06日 14:59
  • 2204

UVa 10044 - Erdos Numbers

題目:Erdos是個偉大的數學家(不知道的話,自行百度吧),他署名的論文有1000多份,             於是數學及澳門定義了一個Erdos數的概念,直接和Erdos發表論文的記為1,  ...
  • mobius_strip
  • mobius_strip
  • 2015年08月20日 21:39
  • 488

UVa 10044 Erdos Numbers

#include #include #include #include #define MAXNAME 500 #define MAX 5000 #define INFINITY -1 ty...
  • holyrain
  • holyrain
  • 2014年05月09日 11:20
  • 295

基于R igraph库的信息传播(Information Diffusion)过程可视化

过程:生成网络;随机选择种子节点,按概率传播;更新图中传播节点信息;按时间线绘图保存。 R代码: transmission_rate = 0.4 coins = c(1, 0)  probabili...
  • huxuanlai
  • huxuanlai
  • 2017年08月24日 16:02
  • 232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Erdos Numbers
举报原因:
原因补充:

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