//拓扑排序模板
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=105;
int bol[maxn];
int topo[maxn],cnt;
int G[maxn][maxn];//保存有向边
int m,n;
bool dfs(int u){//排序u开头的拓扑排序
bol[u]=-1;//标记访问
for(int i=1;i<=m;i++)if(G[u][i]){//如果u到i的有向边存在,操作i
if(bol[i]<0)return false;//如果i被访问过证明有环,失败推出
else if(!bol[i]&&!dfs(i))return false;//有环失败
}
bol[u]=1;topo[--cnt]=u;
return true;
}
bool toposort(){
cnt=m;
memset(bol,0,sizeof(bol));
for(int i=1;i<=m;i++)//遍历所有的点
if(!bol[i])//如果没有被访问过,访问
if(!dfs(i))return false;//如果子序列排序失败,失败
return true;
}
void print(){
for(int i=0;i<m;i++)
cout<<topo[i]<<" ";
cout<<endl;
}
int main(){
while(cin>>m>>n&&m){
int a,b;
memset(G,0,sizeof(G));
for(int i=0;i<n;i++){
cin>>a>>b;
G[a][b]=1;
}
bool jud=toposort();
if(jud)
print();
}
return 0;
}
有向边的拓扑排序 UVA - 10305
最新推荐文章于 2020-07-29 19:30:39 发布