產生冠軍
time limit:1000msmemory limit:32768kb64bit io format:%i64d & %i64u
submit
status
practice
hdu 2094
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
3alice bob
smith john
alice smith
5a c
c dd e
b ea d
0
sample output
yesno
解題報告:一道拓撲排序的簡單應用題。當只有乙個入度為0的物件時,則能產生冠軍,否則不能。注意:人名必須用字串存起來,不能用acsll值代替。
code:
#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int max=2005;
struct node
indegree[max];
int main()
{ // freopen("input.txt","r",stdin);
int t;
while(~scanf("%d",&t))
{if(!t)
break;
getchar();
memset(indegree,0,sizeof(indegree));
int total=0,len=0,k=0;
char s1[50],s2[50];
while(t--)
{scanf("%s %s",s1,s2);
int flag0=1,flag1=1,l=len;
for(int i=0; i
產生冠軍 (拓撲排序)
有一群人,打桌球比賽,兩兩捉對撕殺,每兩個人之間最多打一場比賽。球賽的規則如下 如果a打敗了b,b又打敗了c,而a與c之間沒有進行過比賽,那麼就認定,a一定能打敗c。如果a打敗了b,b又打敗了c,而且,c又打敗了a,那麼a b c三者都不可能成為冠軍。根據這個規則,無需迴圈較量,或許就能確定冠軍。你...
產生冠軍((hdu2094))((拓撲排序))
小結。1,利用拓撲排序當確定比賽的名次時用toposort 用ans 記錄入讀為零的點最後再依次輸出即可 這種情況預設不是環形才可 注意對入度隨時的處理 如hdu1285 2,當利用產生冠軍時 記錄 入度,最後看入度為零的點有幾個如果有多個則沒冠軍,否則反之 3,當確定是否能判定名次時 既沒環 用t...
產生冠軍 hdu2094拓撲排序
題意 給你一些比賽情況,看能否產生冠軍 思路 拓撲排序,給每個字串編乙個號,然後就是建圖,只要找到入度為0的點並且只有乙個那就能產生冠軍,否則不行 include include include include includeusing namespace std char str 2005 100...