Ordering Tasks
UVA – 10305 下面的代码是这题的题解;
// dfs的拓扑排序,在遍历V次的基础上 递归 E次, V为顶点数,E为边数
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define Maxn 110
int n,m,G[Maxn][Maxn],vis[Maxn],res[Maxn],p;
bool dfs(int u) {
for(int i = 1 ; i <= n ; ++i) {
if(G[u][i]) {
if(vis[i] == -1) return false; //说明 i 这个顶点出发的dfs还没结束就又重新指向这个点
else if(!vis[i]) { // 则,存在环
vis[i] = -1;
if(!dfs(i)) return false;
else res[p--] = i;
}
vis[i] = 1;
}
}
return true;
}
int main(void)
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(cin >> n >> m) {
if(n == 0 && m == 0) break;
int tmp,tp;
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
memset(res,0,sizeof(res));
for(int i = 1; i <= m ; ++i) {
cin >> tmp >> tp;
G[tmp][tp] = 1;
}
p = n;
for(int i = 1 ; i <= n ; ++i) {
if(vis[i] == 1) continue;
vis[i] = -1; // 一直为 -1 说明一直还在dfs中为返回
if(dfs(i)) res[p--] = i; // 数据的存入是用栈存入的,dfs模拟一下就能明白
else cout << "存在环" << endl;
vis[i] = 1;
}
for(int i = 1; i <= n; ++i) {
cout << res[i];
if(i != n) cout << " "; else cout << endl;
}
}
return 0;
}
也可以参考下刘汝佳的代码;