Toj 1069 Erdos Numbers 解题

Toj 1069 Erdos Numbers 解题

这个题目就是一个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

你可能感兴趣的:(Toj 1069 Erdos Numbers 解题)