拓撲排序 產生冠軍

2021-07-24 00:13:50 字數 1480 閱讀 9970

產生冠軍

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

3

alice bob

smith john

alice smith

5a c

c dd e

b ea d

0

sample output

yes

no

解題報告:一道拓撲排序的簡單應用題。當只有乙個入度為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...