hdu2094

链接:点击打开链接

题意:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char str[1005][500],a[1005],b[1005];
int prefix[1005];
int main(){
    int i,j,k,n,sum,sign;
    while(cin>>n&&n){
        memset(str,0,sizeof(str));
        memset(prefix,0,sizeof(prefix));
        k=1;
        for(i=1;i<=n;i++){
            cin>>a>>b;
            sign=0;
            for(j=1;j<=n;j++)
            if(strcmp(str[j],a)==0){
                sign=1;
                break;
            }
            if(!sign)                   //如果没有出现过这个名字则往里添加
            strcpy(str[k++],a);
            sign=0;
            for(j=1;j<=n;j++)
            if(strcmp(str[j],b)==0){
                prefix[j]++;
                sign=1;
                break;
            }
            if(!sign){
                strcpy(str[k],b);
                prefix[k]++;
                k++;
            }                           //处理b时和处理a一样,只不过需要更新prefix数组
        }
        sum=0;
        for(i=1;i<k;i++){               //只有一个prefix数组值为0时才输出yes,就是冠军只有一个,有环或则有关系不确定的输出no
//            cout<<prefix[i]<<endl;
            if(!prefix[i])
            sum++;
        }
        if(sum==1)
        printf("Yes\n");
        else
        printf("No\n");
    }
    return 0;
}



你可能感兴趣的:(hdu2094)