标签:
[2016-02-18][拓扑排序]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | const int maxn = 100 + 10; //n表示节点数,m表示边数,g保存有向边的信息,vis保存是否访问过节点,t表示当前拓扑排序的编号,topo保存拓扑排序的结果 //注意,这里节点的编号是 1 ~ n int n,m,g[maxn][maxn],vis[maxn],topo[maxn],t; int dfs( int u){ vis[u] = -1; for ( int v = 1,;v < n + 1;v++){ if (g[u][v]){ if (vis[v] < 0) return 0; if (!vis[v] && !dfs(v)) return 0; } } vis[u] = 1; topo[--t] = u; return 1; } int toposort(){ t = n; memset (vis,0, sizeof (vis)); //枚举每一个点,如果存在环,就返回0 for ( int u = 1;u < n+1;u++){ if (!vis[u] && !dfs(u)) return 0; } return 1; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | const int maxn = 100 + 10; int n,m,g[maxn][maxn],vis[maxn],topo[maxn],t; int dfs( int u){ vis[u] = -1; for ( int v = 1,;v < n + 1;v++){ if (g[u][v]){ if (vis[v] < 0) return 0; if (!vis[v] && !dfs(v)) return 0; } } vis[u] = 1; topo[--t] = u; return 1; } int toposort(){ t = n; memset (vis,0, sizeof (vis)); for ( int u = 1;u < n+1;u++){ if (!vis[u] && !dfs(u)) return 0; } return 1; } |
标签:
原文地址:http://www.cnblogs.com/qhy285571052/p/5199597.html