这个题目就是一个bfs的问题。在数据读取上需要稍加处理。
toj和poj的数据都有一个不是很符合规矩然后造成我这个题re了好多次。
期中有一个数据在最后一个人名结束后跟着一个空格然后是:这样我每次读取判断最后一个是:结束就错了
1
#include<vector>
2
#include<map>
3
#include<iostream>
4
#include<string>
5
#include<string.h>
6
using namespace std;
7
struct C
{int p,ans;};
8
vector<int> data[11000];
9
map<string,int> name;
10
int use[11000];
11
C Q[11000];
12
char str[300];
13
int paper[300];
14
string a,b;
15
int main()
16

{
17
int n,m,l=0,i,head,tail,L,l1,NO,j,f,KASE=0;
18
//freopen("erdos.in","r",stdin);
19
//freopen("erdos.txt","w",stdout);
20
string nn;
21
nn="Erdos*P.";
22
while(1)
{
23
scanf("%d%d",&n,&m);
24
if(n==0&&m==0)break;
25
l=0;
26
for(i=0;i<10000;i++)data[i].clear();
27
name.clear();
28
memset(use,-1,sizeof(use));
29
memset(Q,0,sizeof(Q));
30
l=0;
31
while(n--)
32
{
33
f=0;NO=0;
34
while(1)
35
{
36
scanf("%s",str);
37
l1=strlen(str);
38
str[l1-1]='*';
39
a=str;
40
scanf("%s",str);
41
l1=strlen(str);
42
if(str[l1-1]==':')f=1;
43
if(str[l1-1]=='.')f=1;
44
str[l1-1]=0;
45
a=a+str;
46
if(name.count(a)==0)
47
{
48
name[a]=l++;
49
//cout << a << endl;
50
}
51
paper[NO++]=name[a];
52
if(f)
53
{
54
gets(str);
55
//str=getline();
56
break;
57
}
58
}
59
60
for(i=0;i<NO;i++)
61
for(j=0;j<NO;j++)if(i!=j)data[paper[i]].push_back(paper[j]);
62
}
63
if(name.count(nn)==0)name[nn]=l++;
64
Q[0].p=name[nn];
65
Q[0].ans=0;
66
use[name[nn]]=0;
67
head=tail=0;
68
tail++;
69
while(head!=tail)
70
{
71
L=Q[head].p;
72
l=data[L].size();
73
for(i=0;i<l;i++)
74
if(use[data[L][i]]==-1)
75
{
76
use[data[L][i]]=Q[head].ans+1;
77
Q[tail].p=data[L][i];
78
Q[tail++].ans=Q[head].ans+1;
79
}
80
head++;
81
}
82
printf("Database #%d\n",++KASE);
83
while(m--)
84
{
85
86
scanf("%s",str);
87
printf("%s ",str);
88
l1=strlen(str);
89
str[l1-1]='*';
90
a=str;
91
scanf("%s",str);
92
printf("%s: ",str);
93
a=a+str;
94
if(name.count(a)==0)printf("infinity\n");
95
else if(use[name[a]]==-1)printf("infinity\n");
96
else printf("%d\n",use[name[a]]);
97
}
98
printf("\n");
99
}
100
return 0;
101
}
102
103
104