巡回赛 -- 简单的拓扑排序
这是我最爱的 红色 . NICE
题意 : 第一行 测试案例的组数 第二行每一组案例的 拳手个数 和 比赛的场数 如果不能确定唯一的排名 就输出 No Answer 下面附上渣渣代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 using namespace std; 15 int a[30][30],n,m,visited[30],result[30]; 16 void topsort() // 有唯一的 序列 17 { 18 int mark=0,flag,fuck=1; 19 for(int i=1;i<=n;i++) // 从第一名开始找 20 { 21 mark=0; 22 for(int j=0;j<n;j++) // 从这些人中 开始找 23 { 24 if(visited[j]==0) // 没有爸爸 25 { 26 flag=j; // 这个 没有 爸爸 27 mark++; 28 } 29 } 30 if(mark!=1) // 1 : mark=0 就是 都有爸爸 , 成环了 2 : 有两个没爸爸的 , 搞基了 31 { 32 fuck=0; 33 printf("No Answer"); 34 break; 35 } 36 result[i]=flag; // 第一名存起来 37 visited[flag]--; // 第一名欠一个爸爸 ( 这个人已经被用了 ) 38 for(int k=0;k<n;k++) 39 { 40 if(a[k][flag]) // 以刚才没有爸爸的人 做爸爸的 ( 也就是 没有爷爷 ) , 现在爸爸死了 , 儿子们的亲爸爸 -1 41 { 42 visited[k]--; 43 } 44 } 45 } 46 if(fuck) 47 for(int i=1;i<=n;i++) 48 printf("%c",result[i]+'A'); 49 printf("\n"); 50 } 51 int main() 52 { 53 int t; 54 scanf("%d",&t); 55 while(t--) 56 { 57 scanf("%d%d",&n,&m); 58 memset(visited,0,sizeof(visited)); 59 memset(a,0,sizeof(a)); 60 for(int i=0;i<m;i++) 61 { 62 char b,c; 63 scanf(" %c %c",&b,&c); 64 if(a[c-'A'][b-'A']==0) // 直接 防止 有重边 //由于 从 高到底输出 65 { 66 a[c-'A'][b-'A']=1; // c 有一个 叫做 b 的 爸爸 67 visited[c-'A']++; // c 的爸爸数 ++ 68 } 69 } 70 topsort(); 71 } 72 }