1. 程式人生 > >oj---poj4084----拓撲排序

oj---poj4084----拓撲排序

printf push_back lis back pri int scan 條件 從大到小

給出一個圖的結構,輸出其拓撲排序序列,要求在同等條件下,編號小的頂點在前。

用小頂堆(優先隊列)實現.

priority_queue<int, vector<int>, greater<int> > Q;//從小到大的優先級隊列,可將greater改為less,即為從大到小

樣例如下:

6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5

v1 v3 v2 v6 v4 v5

分析:如果不用優先隊列V6肯定會排在V3前面的.用了優先隊列,V3插隊了.

AC

#include<cstdio>
#include<queue>
#include
<vector> #include<algorithm> using namespace std; vector<int>list[500]; int indegree[500]; priority_queue<int,vector<int>,greater<int> > Q; queue<int> res; int main(){ int n,m; scanf("%d %d",&n,&m); fill(indegree+1,indegree+1+n,0); for(int
i=1;i<=n;i++) list[i].clear(); int u,v; for(int i=0;i<m;i++){ scanf("%d %d",&u,&v); indegree[v]++; list[u].push_back(v); } while(!Q.empty()){Q.pop();} for(int i=1;i<=n;i++){ if(indegree[i]==0){ Q.push(i); } }
//Q存放度為0的點 int cnt=0; while(!res.empty()){res.pop();} while(!Q.empty()){ int firstp=Q.top(); //優先隊列改成top res.push(firstp); cnt++; Q.pop(); for(int i=0;i<list[firstp].size();i++){ indegree[list[firstp][i]]--; if(indegree[list[firstp][i]]==0){ Q.push(list[firstp][i]); } } } if(cnt==n){ //DAG for(int i=0;i<n;i++){ int tmp=res.front(); res.pop(); if(i==0){ printf("v%d",tmp); } else printf(" v%d",tmp); } } else puts("No DAG"); return 0; }

oj---poj4084----拓撲排序