题意:给出n对选手姓名,每对表示前者赢后者,求整场比赛是否有冠军;
思路:将名字用数字表示,离散化,然后就是裸裸的拓扑排序,只需判断初始时入度为0的是否唯一;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,i,j,k,con; int mm[1001][1001],indegree[500010]; char s1[500010],s2[500010],match[1001][101],pos1,pos2; void tuopu() { int i,j,k; int c=0; for(i=0;i<con;i++) { if(indegree[i]==0) c++; } if(c==1) printf("Yes\n"); else printf("No\n"); } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) break; con=0; memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); memset(match,0,sizeof(match)); memset(indegree,0,sizeof(indegree)); memset(mm,0,sizeof(mm)); for(i=0;i<n;i++) { scanf("%s%s",s1,s2); for(j=0;j<con;j++) { if(strcmp(match[j],s1)==0) { pos1=j; break; } } if(j==con) strcpy(match[con++],s1),pos1=con-1; for(j=0;j<con;j++) { if(strcmp(match[j],s2)==0) { pos2=j; break; } } if(j==con) strcpy(match[con++],s2),pos2=con-1; if(!mm[pos1][pos2]) { mm[pos1][pos2]=1; indegree[pos2]++; } } tuopu(); } return 0; }
原文:http://blog.csdn.net/dominating413421391/article/details/44245613