HDU 2094 产生冠军(拓扑排序)

来源:互联网 发布:kcf跟踪算法原理 编辑:程序博客网 时间:2024/05/16 19:16

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094

题        意:给你几个选手的比赛胜负,让你判断是否产生冠军。

思        路:按图的方式输入,找到入度为0的点的个数进行判断(及拓扑排序的应用)。

代码如下:

#include <iostream>using namespace std;#include <string.h>#include <stdio.h>#include <climits>#include <algorithm>#define maxn  65535typedef __int64 LL;char ben[1200][20];int in[1200],si;int findx( char s[20] ){    int i;    for( i = 0; i < si; i ++ )        if( strcmp( ben[i], s ) == 0 ) break;    if( si == i ) strcpy(ben[si++],s);//若是没有出现过得选手则更新数组,把该选手加入    return i;}int main(){    int n;    while( scanf ( "%d", &n ) != EOF )    {        if( n == 0 ) break;        memset( in, 0, sizeof( in ) );        si = 0;        for( int i = 0; i < n; i ++ )        {            char s1[20], s2[20];            scanf ( "%s %s", s1, s2 );            int p1 = findx(s1);//判断s1选手是否在里面            int p2 = findx(s2);//找到s2选手的位置,并将其的入度加1            in[p2]++;        }        int ans = 0;        for( int i = 0; i < si; i ++ )        {            if( in[i] == 0 ) ans++;            if( ans > 1 ) break;//这种情况代表有几位选手没有分出胜负        }        if( ans == 1 ) printf("Yes\n");        else printf("No\n");    }    return 0;}

0 0