

这是我最爱的 红色 . 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("
");
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 }