拓扑排序
Posted lhlccc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序相关的知识,希望对你有一定的参考价值。
大概解决问题:给定优先级关系,输出依次顺序
方法:先把最低级的放入vector,最后反向输出即可。
#include<bits/stdc++.h> using namespace std; const int MAXN=30030; bool vis[MAXN]; int in[MAXN]; int ans; vector<int> edge[MAXN]; int main() { int T; cin>>T; int n,m,a,b; while(T--) { scanf("%d%d",&n,&m); memset(in,0,sizeof(in)); for (int i=1;i<=n;i++) edge[i].clear(); for (int i=0;i<m;i++) { scanf("%d%d",&a,&b); in[a]++; edge[b].push_back(a); } priority_queue<int>q; for (int i=1;i<=n;i++) { if(!in[i]) q.push(i); } vector<int>v; ans=0; while(!q.empty()) { ans++; a=q.top(); v.push_back(a); cout<<a<<" 进队"<<endl; q.pop(); vis[a]=1; for (int i=0;i<edge[a].size();i++) { b=edge[a][i]; in[b]--; if (!in[b]) q.push(b); } } for (int i=v.size()-1;i>=0;i--) { if (i!=v.size()-1) printf(" "); printf("%d",v[i]); } printf(" "); } return 0; }
以上是关于拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章