1. 程式人生 > >hdu1285確定比賽名次(拓撲排序+優先佇列)

hdu1285確定比賽名次(拓撲排序+優先佇列)

傳送門

第一道拓撲排序題

每次刪除入度為0的點,並輸出

這題要求隊名小的排前面,所以要用到過載的優先佇列

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 priority_queue<int,vector<int>,greater<int> > q;//優先佇列預設是值越大,優先順序越高,這裡過載了,升序排列 
 4 int mapp[505][505],in[505];
 5 void topo(int n)
 6 {
 7     for(int i=1;i<=n;i++)
8 { 9 if(in[i]==0)q.push(i);//如果頂點的入度為0,入隊 10 } 11 int c=1; 12 while(!q.empty()) 13 { 14 int v=q.top(); 15 q.pop(); 16 if(c<n) 17 { 18 printf("%d ",v); 19 c++; 20 }else 21 { 22 printf("
%d\n",v); 23 24 } 25 for(int i=1;i<=n;i++)//刪除該頂點 26 { 27 if(!mapp[v][i]) 28 { 29 continue; 30 } 31 in[i]--;//目標頂點的入度減1 32 if(!in[i])q.push(i); //目標頂點入度==0,就入隊 33 } 34 }
35 } 36 int main() 37 { 38 int n,m; 39 while(~scanf("%d %d",&n,&m)) 40 { 41 memset(mapp,0,sizeof(mapp)); 42 memset(in,0,sizeof(in)); 43 44 for(int i=0;i<m;i++) 45 { 46 int p1,p2; 47 scanf("%d %d",&p1,&p2); 48 if(mapp[p1][p2])continue; 49 else mapp[p1][p2]=1; 50 in[p2]++;//入度 51 } 52 topo(n); 53 } 54 55 return 0; 56 }
View Code