您的位置:首页 > 其它

hdu 2094 产生冠军

2017-04-16 09:28 393 查看
题意:给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: