NYOJ 496 巡回赛 拓扑排序
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                NYOJ  496  巡回赛  拓扑排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                巡回賽
時間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:3 描述現(xiàn)給出 M 場比賽的勝負關(guān)系,請你幫組委會決定是否能夠唯一確定這樣的排名,使得所有的拳擊手都滿意,若能唯一確定則輸出最終排名。 輸入
如 “A B”則表示在某場比賽中 A 戰(zhàn)勝了 B。
解題思路:先找到一個入度為0的點,從這個點開始找下一個入度為0的點,直到把所有的點都找完;在找的過程中,如果同時有多個或0個入度為0的點(最后一個點除外),則不存在拓撲排序。
#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的點*/}if(incnt!=1)flag=0;j=0; /*記錄保存的點的個數(shù)*/while(front<rear){incnt=0;k=b[front++];c[j++]=k+'A'-1; /*保存排好序的點*/for(i=1;i<=n;i++) /*注意是n個點,不要寫成m*/{if(map[k][i]){in[i]--;if(!in[i]) {incnt++;b[rear++]=i;/*如果入度為0,加入隊尾*/}} }if(incnt>1) /*如果入度為0的點大于1個,不存在拓撲排序。特別注意此處,不能寫成incnt!=1,因為從最后一個點找,入度為0的點肯定是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 矩形嵌套(动态规划)
