程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 九度OJ 教程81 拓撲排序——確立比賽名次

九度OJ 教程81 拓撲排序——確立比賽名次

編輯:C++入門知識

[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;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved