NYOJ 496 巡回赛 拓扑排序
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 496 巡回赛 拓扑排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
巡回賽
時間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:3 描述現(xiàn)給出 M 場比賽的勝負(fù)關(guān)系,請你幫組委會決定是否能夠唯一確定這樣的排名,使得所有的拳擊手都滿意,若能唯一確定則輸出最終排名。 輸入
如 “A B”則表示在某場比賽中 A 戰(zhàn)勝了 B。
解題思路:先找到一個入度為0的點(diǎn),從這個點(diǎn)開始找下一個入度為0的點(diǎn),直到把所有的點(diǎn)都找完;在找的過程中,如果同時有多個或0個入度為0的點(diǎn)(最后一個點(diǎn)除外),則不存在拓?fù)渑判颉?/p>
#include<stdio.h> #include<string.h> int map[30][30],b[50],n,m,in[50]; char c[100]; void toposort() {int incnt=0,flag=1,front=1,rear=1,i,j,k;for(i=1;i<=n;i++)if(!in[i]){incnt++;b[rear++]=i; /*找第一個入度為0的點(diǎn)*/}if(incnt!=1)flag=0;j=0; /*記錄保存的點(diǎn)的個數(shù)*/while(front<rear){incnt=0;k=b[front++];c[j++]=k+'A'-1; /*保存排好序的點(diǎn)*/for(i=1;i<=n;i++) /*注意是n個點(diǎn),不要寫成m*/{if(map[k][i]){in[i]--;if(!in[i]) {incnt++;b[rear++]=i;/*如果入度為0,加入隊(duì)尾*/}} }if(incnt>1) /*如果入度為0的點(diǎn)大于1個,不存在拓?fù)渑判颉L貏e注意此處,不能寫成incnt!=1,因?yàn)閺淖詈笠粋€點(diǎn)找,入度為0的點(diǎn)肯定是0,flag會變成0*/{flag=0;break;}}if(j<n||!flag)printf("No Answer\n");else{for(i=0;i<j;i++)printf("%c",c[i]);printf("\n");} } int main() {int t,i;scanf("%d",&t);while(t--){char A,B;int a,b;memset(map,0,sizeof(map));memset(in,0,sizeof(in));memset(c,0,sizeof(c));scanf("%d%d",&n,&m);getchar();for(i=1;i<=m;i++){scanf("%c %c",&A,&B);a=A-'A'+1;b=B-'A'+1;map[a][b]=1;in[b]++;getchar();}toposort();}return 0; }總結(jié)
以上是生活随笔為你收集整理的NYOJ 496 巡回赛 拓扑排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代生活已经离不开的银行卡支付,背后原理
- 下一篇: NYOJ 16 矩形嵌套(动态规划)