[csharp] //九度OJ 教程81 拓撲排序之確立比賽名次 //有向圖利用存儲矩陣存儲,另設一個標記數組flag[]表示已經被刪除的節點。 #include <stdio.h> #include<string.h> #define MAXS 502 int main() { www.2cto.com int n,m,i,j,k,mark[MAXS][MAXS]={0},flag[MAXS]; while(~scanf("%d %d",&n,&m)) { memset(mark,0,MAXS*MAXS*sizeof(int)); memset(flag,1,MAXS*sizeof(int));//設置未訪問標志。 while(m--) { scanf("%d %d",&i,&j); if(mark[i][j])continue;//防止變態的case給重復輸入某個結果…… mark[i][j]=1; mark[0][j]++;//0行j列存儲入度數,即選手j被擊敗的次數。 } for(j=1;j<n;j++)//純粹為了執行n-1次,沒其他意思。取出前n-1名,最後一名單獨處理,要加\n的。 { for(k=1;k<=n;k++) { if(flag[k]&&(mark[0][k]==0)) { flag[k]=0;//設置移除標志 break;//結束循環。 } } printf("%d ",k); for(i=1;i<=n;i++)//把該點從圖中去除。 { if(mark[k][i]) { mark[k][i]=0; mark[0][i]--;//被擊敗數減一。 } } } for(k=1;k<=n;k++) { if(flag[k]&&(mark[0][k]==0)) { flag[k]=0; break; } } printf("%d\n",k); } return 0; }