题目描述:
有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
-
输入:
-
输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。
-
输出:
-
对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。
-
样例输入:
-
3 Alice Bob Smith John Alice Smith 5 a c c d d e b e a d 0
-
样例输出:
-
Yes No
-
没有使用容器来做邻接矩阵的数据结构,代码变得好长....
-
另外要注意当邻接矩阵刚刚建立的时候,如果有超过一个节点的入度全都为0的话,即使拓扑排序存在,也还是无法得到冠军
-
譬如
-
a->b;
-
c->d;
-
邻接矩阵为:
-
0 0 0 0
-
1 0 0 0
-
0 0 0 0
-
0 0 1 0 此时拓扑排序存在,但是无法判断a/c谁是冠军
-
#include <iostream> #include <cstdio> #include<map> #include<string> using namespace std; int xulie[2001]; char Edge[2001][2001];//邻接矩阵(char是为了节省内存)只记录入度,出度不考虑 bool mark[2001];//标记那个节点已经被拓扑出来了 int i, j; map<string, int> Name; void initEdge(int N)//初始化邻接矩阵 { for(j = 1; j<=N; j++) { for(i = 1; i<=N; i++) { Edge[j][i] = '0'; } } for(i = 1; i<=N; i++) { mark[i] = false;//初始化标记 } } int main() { int N, n, M, x, y, Index; string X,Y; while(cin>>M && M!=0) { int ans = 1; initEdge(2000); Name.clear(); while(M--) { cin>>X>>Y; if(Name.end() == Name.find(X)) { Name[X] = ans; x = ans++; } else { x = Name[X]; } if(Name.end() == Name.find(Y)) { Name[Y] = ans; y = ans++; } else { y = Name[Y]; } Edge[y][x] = '1';//x->y 记录y的入度 } int num = 0; for(i=1; i<ans; i++) { Index = 0; for(j=1; j<ans;j++) { if('0' == Edge[i][j]) { Index++; } } if(Index == ans-1) { num++; } } if(num > 1) { cout<<"No"<<endl; continue; } n = ans-1; N = n; ans = 0; while(n--)//若拓扑排序存在则取了N个节点 { for(j = 1; j<=N; j++) { Index = 0; if(mark[j] != true) { for(i = 1; i<=N; i++) { if(Edge[j][i] == '0') { Index++; } } } if(Index == N)//找到一个没有入度的节点 { Index = j; mark[j] = true;//标记 xulie[ans++] = Index; break; } } if(j != N+1) { //cout<<Index<<endl; for(i = 1; i<=N; i++) { Edge[i][Index] = '0';//将刚刚找到的那个拓扑节点的入度全部清零 } } } Index = -1; for(i=1; i<=N;i++) { for(j=1;j<=N;j++) { if(Edge[i][j] == '1') { Index++;//检查最后整个邻接矩阵是不是都被置零了,如果都置零了那么说明找到拓扑序列了 } } } if(Index == -1) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } } /************************************************************** Problem: 1450 User: hrdjmax2 Language: C++ Result: Accepted Time:150 ms Memory:5448 kb ****************************************************************/