题面链接
https://www.acwing.com/problem/content/850/
思路
对于一个有向图来说,只有无环有向图才有拓扑序列,也可以说一个无环有向图必然有拓扑序列,但是不唯一,我们通过逐步将入度为0的点加进我们的队列里面,然后不断地删边,然后再将下一个度为0的点放进来这样就是我们拓扑排序的一种求解方式了
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
ll ksm(ll a,ll b) {
ll ans = 1;
for(;b;b>>=1LL) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
}
return ans;
}
ll lowbit(ll x){return -x & x;}
const int N = 2e6+10;
int n,m,q,d[N],vis[N];
vector<int> V[N],ans;
bool topsort(){
queue<int> que;
for(int i = 1;i <= n; ++i) {
if(!d[i]) que.push(i);
}
while(!que.empty()){
int t = que.front();
que.pop();
ans.push_back(t);
for(int i = 0,l = V[t].size();i < l; ++i){
d[V[t][i]]--;
if(!d[V[t][i]]) que.push(V[t][i]);
}
}
return ans.size()==n;
}
void slove(){
if(topsort()){
for(int i = 0;i < n; ++i) {
cout<<ans[i]<<" \n"[i==n-1];
}
}
else{
cout<<"-1"<<endl;
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
cin>>n>>m;
int u,v;
for(int i = 0;i < m; ++i) {
cin>>u>>v;
V[u].push_back(v);
d[v]++;
}
slove();
return 0;
}
|