标签:bcf lap long hide gre sort amp ack priority
题意:给N个点M条边,判断是否构成有环图,若无,输出字典序最小的拓扑序列
思路:拓扑排序+优先队列
//By DXY 2018.04.26 //按字典序就用优先队列即可 //拓扑排序+优先队列 #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<map> using namespace std; #define ll long long int n,m,cnt; int d[500000+10],deg[50000+100],head[1000000+10]; struct node { int to,next; }p[1000000+10]; void add(int x,int y) { cnt++; p[cnt].to=y; p[cnt].next=head[x]; head[x]=cnt; } void topsort() { cnt=0; priority_queue< int,vector<int> ,greater<int> > q; for(int i=1;i<=n;i++) if(deg[i]==0) q.push(i); while(q.size()) { int u=q.top(); d[++cnt]=u; q.pop(); for(int i=head[u];i;i=p[i].next) { int v=p[i].to; if(--deg[v]==0) { q.push(v); } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); deg[b]++; add(a,b); } topsort(); if(cnt<n) { cout<<"No Answer!"<<endl; return 0; } for(int i=1;i<=n;i++) { cout<<d[i]<<" "; } cout<<endl; return 0; }
标签:bcf lap long hide gre sort amp ack priority
原文地址:https://www.cnblogs.com/Dxy0310/p/9534195.html