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