2094

来源:互联网 发布:国家网络风险评估标准 编辑:程序博客网 时间:2024/06/11 00:54

拓扑排序,关键是要知道参赛者的人数

#include<iostream>
#include<stdio.h>
#include<cstring>
usingnamespace std;
//关键要找到选手个数
intindegree[2000];//统计每个节点的入度
structMen{
      charname[150];
}buf[1001];
voidprint(intk){
   intcount = 0;
   for(inti = 0;i<k;i++)//从所有选手中找入度为0
   {
      if(indegree[i]==0)
          count++;
   }
   if(count==1)
       printf("Yes\n");
   else
       printf("No\n");
 
}
intmain(){
   
  intn;
  charname1[200],name2[200];
  while(scanf("%d",&n)!=EOF&&n!=0){
      for(inti = 0;i<1500;i++)indegree[i]=0;//初始化
      intk = 0;//统计参赛人数
      for(inti = 1;i<=n;i++)
      {
          intflag = 0;//作为是否之前参加过的标记
          scanf("%s %s",name1,name2);
          //要判断是否之前参加过比赛
          for(intj = 0;j<k;j++)
          {
              if(strcmp(buf[j].name,name1)==0)//与之前出现过的一样,则不用在k上增加人数
              {
                  flag = 1;//表示之前有参加过
                  break;//跳过
              }
          }
          if(flag==0){
              strcpy(buf[k].name,name1);//把name1的名字给该参赛者
              k++;
          }
          flag = 0;
          for(intj = 0;j<k;j++)
          {
              if(strcmp(buf[j].name,name2)==0)//与之前出现过的一样,则不用在k上增加人数
              {
                  flag = 1;//表示之前有参加过
                  indegree[j]++;//入度+1
                  break;//跳过
              }
          }
          if(flag==0){
              strcpy(buf[k].name,name2);//把name1的名字给该参赛者
              indegree[k]++;//入度+1
              k++;
          }
      }
      print(k);
  }
  return0;
}

0 0
原创粉丝点击