#include<algorithm>
#include<cstdio>
#include<iostream>
#include<memory.h>
#define maxn 3001
int c[maxn],topo[maxn],g[maxn][maxn],t,n,m,v;
bool dfs(int u){
c[u]=-1;//标记为-1,表示正在访问(即dfs(u)在栈帧中,尚未返回)
for(int v=1;v<=n;v++)
if(g[u][v]==1)
{
if(c[v]==-1) return false; //判断是否为DAG,如果不是则退出
else if(!c[v]&&!dfs(v)) return false;
}
c[u]=1; //标记为以访问过
topo[t--]=u;
return true;
}
bool toposort(){
t=n;
memset(c,0,sizeof(c));
for (int u=1;u<=n;u++) if(!c[u]&&!dfs(u)) return false;
return true;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{int x,y;
scanf("%d%d",&x,&y);
g[x][y]=1;
}
if (!toposort()) printf("No Topology\n");
else for (int i=1;i<=n;i++) printf("%d ",topo[i]);
printf("\n");
return 0;
}
拓扑排序
最新推荐文章于 2025-03-10 20:41:45 发布