首页 > 代码库 > 产生冠军(拓扑排序)

产生冠军(拓扑排序)

http://acm.hdu.edu.cn/showproblem.php?pid=2094

 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 int n; 5 int map[2001][2001],d[2001],v[2001]; 6 char name[2001][101]; 7 int tt; 8 int findx(char *s) 9 {10     int i;11     for(i=0;i<tt;i++)12         if(strcmp(name[i],s)==0)13          return i;14     if(i>=tt)15     {16         strcpy(name[tt],s);17         tt++;18     }19     return tt-1;20 }21 int main()22 {23     char a[100],b[100];24     int x,y,j;25     int flag;26     while(scanf("%d",&n)!=EOF&&n!=0)27     {28         tt=0;29         memset(v,0,sizeof(v));30         memset(d,0,sizeof(d));31         memset(map,0,sizeof(map));32         for(int i=0;i<n;i++)33         {34             scanf("%s%s",a,b);35             x=findx(a);36             y=findx(b);37 38             if(!map[x][y])39             {40                 map[x][y]=1;41                 d[y]++;42             }43         }44         flag=0;45         for(j=0;j<tt;j++)46         {47             if(v[j]==0&&d[j]==0)48             {49                 v[j]=1;50                 flag++;51             }52         }53         if(flag==1)54             printf("Yes\n");55         else56         printf("No\n");57 58     }59     return 0;60 }