拓扑排序的dfs实现,核心思想就是递归了,注意倒着存储,然后问题解决;
基本思路:
递归,然后状态的划分,包括正在访问,访问,访问完毕的点;
核心代码:
#include<iostream>
#include<iomanip>
#include<string>
#include<queue>
#include<map>
#include<list>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn = 100+10;
int vis[maxn];//vis数组用来标记第i个点的状态,-1表示正在访问,0表示还未访问,1表示已经访问;
int topo[maxn],pos;
int gra[maxn][maxn],n=10;
bool dfs(int i)
{
vis[i]=-1;
for(int j=0;j<n;j++)
if(gra[i][j])
if(vis[j]<0) return false;//j正在访问中说明有环;
else if(!vis[j]&&!dfs(j)) return false;//j没有被访问,但是访问发现行不通,返回false;
vis[i]=1;
topo[--pos]=i;
return true;
}
bool toposort()
{
pos=n;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
if(!vis[i])
if(!dfs(i)) return false;
}
return true;
}