hdu 2094 产生冠军

xiaoxiao2021-02-28  6

题目链接:点这里

Problem Description

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

Input

输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。

Output

对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。

Sample Input

3 Alice Bob Smith John Alice Smith 5 a c c d d e b e a d 0

Sample Output

Yes No

【题意】

给你一些人的名字,每行两个,表示叫名字1的比名字2的强。而且有一些规则,如果a胜了b,且b胜了c,那么无论a和c谁胜谁败都默认a比c厉害。然后给你一些关系,问你是否能确定冠军是谁。

【分析】

题意简单,题目也简单,说是拓扑排序,其实没那么麻烦,直接计算入度看入度为0的点是多少个,因为入度为0那么就可能是冠军。如果入度超过一个,那么就不能确定冠军是谁,所以直接统计入度就行了,至于字符串, 直接用一个map就能搞定。

【代码】

#include<iostream> #include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<vector> #include<cmath> #include<stdlib.h> #include<time.h> #include<stack> #include<set> #include<map> #include<queue> #include<sstream> using namespace std; #define rep0(i,l,r) for(int i = (l);i < (r);i++) #define rep1(i,l,r) for(int i = (l);i <= (r);i++) #define rep_0(i,r,l) for(int i = (r);i > (l);i--) #define rep_1(i,r,l) for(int i = (r);i >= (l);i--) #define MS0(a) memset(a,0,sizeof(a)) #define MS1(a) memset(a,-1,sizeof(a)) #define MSi(a) memset(a,0x3f,sizeof(a)) #define sin1(a) scanf("%d",&(a)) #define sin2(a,b) scanf("%d%d",&(a),&(b)) #define sll1(a) scanf("%lld",&(a)) #define sll2(a,b) scanf("%lld%lld",&(a),&(b)) #define sdo1(a) scanf("%lf",&(a)) #define sdo2(a,b) scanf("%lf%lf",&(a),&(b)) #define inf 0x3f3f3f3f #define lson i<<1,l,mid #define rson ((i<<1)|1),mid+1,r #define uint unsigned int typedef pair<int,int> PII; #define A first #define B second #define pb push_back #define MK make_pair #define ll long long template<typename T> void read1(T &m) { T x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } m = x*f; } template<typename T> void read2(T &a,T &b) { read1(a); read1(b); } template<typename T> void read3(T &a,T &b,T &c) { read1(a); read1(b); read1(c); } template<typename T> void out(T a) { if(a>9) out(a/10); putchar(a%10+'0'); } template<typename T> void outn(T a) { if(a>9) out(a/10); putchar(a%10+'0'); puts(""); } using namespace std; ///--------------------------------------------------------------------------------- map<string,int>x; int string_num; int in[1005]; int main() { // freopen("in.txt","r",stdin); int len; while(read1(len),len) { memset(in,0,sizeof(in)); x.clear(); string_num=0; string a,b; while(len--) { cin>>a>>b; if(x[a]==0) x[a]=++string_num; if(x[b]==0) x[b]=++string_num; in[x[b]]++; } int flag=0; rep1(i,1,string_num) { if(in[i]==0) flag++; } if(flag==1) puts("Yes"); else puts("No"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-200193.html

最新回复(0)