#include<iostream>
#include<cstring>
using namespace std;
int n,m,topo[100]; //topo数组用来储存最终形成的拓扑序列
int G[100][100]; //储存有序对信息
int c[100]; //储存每个节点是否被访问过的信息
int t;
bool dfs(int u){
c[u]=-1;
//该段代码的一个亮点,表示u节点正在被访问
for(int v=1;v<=n;v++) { //反向寻找
if(G[u][v]) //如果这个节点的入度不为零则继续dfs寻找第一个入度为零的点
{
if(c[v]==-1) //访问到正在访问的节点,即为存在有向环
return false;
if(c[v]==0){
if(!dfs(v)) //深度优先遍历
return false;
}
}
}
c[u]=1; //返回时将该节点标记为已访问过
topo[--t]=u; //将此节点插入拓扑序列 可以用栈
return true;
}
int main(){
int a,b;
cin>>n>>m;
t=n;
memset(G,0,sizeof(G));
memset(c,0,sizeof(c));
for(int i=0;i<m;i++) {
cin>>a>>b;
G[a][b]=1;
}
for(int u=1;u<=n;u++) {
if(!c[u]) //如果该节点没有被访问过
if(!dfs(u)){ //dfs函数对图中节点进行深度优先遍历,返回值表示拓扑排序是否存在
cout<<"存在有向环,失败退出"<<endl;
return 0;
}
}
for(int i=0;i<n;i++)
cout<<topo[i]<<" "<<endl;
return 0;
}
dfs拓扑
最新推荐文章于 2023-09-04 15:59:19 发布