1. 程式人生 > >杭電ACM1285----確定比賽名次『拓撲排序』

杭電ACM1285----確定比賽名次『拓撲排序』

sizeof color scan class logs 優先隊列 nbsp pop --

 1 //裸拓撲排序,註意先輸出比較小的數,使用優先隊列即可
 2 #include <cstdio>
 3 #include <vector>
 4 #include <cstring>
 5 #include <queue>
 6 #include <algorithm>
 7 using namespace std;
 8 const int maxn = 505;
 9 vector<int> v[maxn];
10 priority_queue<int> q;
11 int f[maxn];
12 int main()
13 { 14 int n,m,x,y; 15 while(~scanf("%d%d",&n,&m)) 16 { 17 memset(f,0,sizeof f); 18 for(int i = 1; i <= n; ++i) 19 v[i].clear(); 20 while(m--) 21 { 22 scanf("%d%d",&x,&y); 23 v[x].push_back(y); 24 ++f[y];
25 } 26 for(int i = 1; i <= n; ++i) 27 if(f[i] == 0) 28 q.push(-i);//默認大根堆 29 bool flag = true; 30 while(!q.empty()) 31 { 32 int t = -q.top(); q.pop(); 33 if(flag) { printf("%d",t); flag = false;} 34 else
printf(" %d",t); 35 for(int i = 0; i < v[t].size(); ++i) 36 if(!(--f[v[t][i]])) q.push(-v[t][i]); 37 } 38 printf("\n"); 39 } 40 return 0; 41 }

杭電ACM1285----確定比賽名次『拓撲排序』