拓扑排序其实还是挺奇妙的,就是解决谁先谁后的问题,solve contradictions and make the world peaceful接下来就探讨一下拓扑排序的两种实现方法。
一(DFS):
1.(无环)
我们给定一个有向无环图:
DFS是从一个点不断往下递归,比如说从序号1往下递归,有箭头就一直往下进行,直到到了最后一个元素,就开始往栈里(当然也可以是vector之类的,只不过需要反向再输出)push元素。比如说上面的从序号1开始,到序号2,序号3,序号4,到尽头了,就把4push进栈中,3push进栈,这个时候由于5也是2的下一个元素,所以5push进栈中,2push进栈,1push进栈,然后输出就是1 2 5 3 4.
当然这个递归的顺序是与你输入的顺序有关的,不过思路都是这样的,由起始点向下递归。
所以说dfs的代码还是比较简单的:
#include <bits/stdc++.h>
const int inf=0x3f3f3f3f;
using namespace std;
bool vis[1001];
vector<int>G[1002]; //邻接表
vector<int>ans;
void dfs(int x)
{
int i,v;
vis[x]=1;
for(i=0;i<G[x].size();i++)
{
v=G[x][i];
if(!vis[v])
{
vis[v]=1;
dfs(v);
}
}
ans.push_back(x); //这一层完毕才把它自己扔进去。
}
int main()
{
int n,m,i,A,B;
cin>>n>>