概要
在一個有向無環圖中,對其所有頂點進行拓補排序,就是将所有頂點排成一個序列,并使得序列中所有的點滿足對于邊<u,v>,若u到v是可達的,則u在拓補序列中一定出現在v之前。
過程
①找到目前入度為0的點,加入拓補序列
②将找到的入度為0的點的出邊和該點删除
③重複上面兩個步驟
簡要實作
最後
代碼
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 80112002;
int g[5010][5010];
queue<int>q;
int in_degree[5010];
int f[5010];
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int u,v;
cin>>u>>v;
g[u][v] = 1;
in_degree[v]++;
}
for(int i = 1; i <= n; i++)
{
if(in_degree[i] == 0)
{
f[i] = 1;
q.push(i);
}
}
ll ans = 0;
while(!q.empty())
{
int k = q.front();
q.pop();
cout<<k<<" ";
for(int i = 1; i <= n; i++)
{
if(!g[k][i])continue;
in_degree[i]--;
if(!in_degree[i])
{
q.push(i);
}
}
}
}