UVA
来源:互联网 发布:全套大富豪棋牌源码 编辑:程序博客网 时间:2024/06/15 19:45
拓扑排序模板题。
dfs型代码:
#include <iostream>#include <string>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define maxn 105int c[maxn], g[maxn][maxn];int topo[maxn], t, n;bool dfs(int u){ c[u] = -1; for(int v = 0; v < n; v++) { if(g[u][v]) { if(c[v] < 0) return false; 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 = 0; u < n; u++) { if(!c[u]) { if(!dfs(u)) return false; } } return true;}int main(){ int m; while(cin >> n >> m && m+n) { memset(g, 0, sizeof(g)); for(int i = 1; i <= m; i++) { int a, b; cin >> a >> b; g[a-1][b-1] = 1; } toposort(); for(int i = 0; i < n; i++) { if(!i) cout << topo[i]+1; else cout << " " << topo[i]+1; } cout << endl; } return 0;}
队列型:
#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 105;int n, m;int indegree[maxn] = {0}, gragh[maxn][maxn], res[maxn];void toposort(){ queue <int> q; int cnt = 0; for (int i = 0; i < n; i++) if (indegree[i] == 0) q.push(i); while (!q.empty()) { int tmp = q.front(); q.pop(); res[cnt++] = tmp; for (int i = 0; i < n; i++) if (gragh[tmp][i] != 0) if (--indegree[i] == 0) q.push(i); } printf("%d", res[0] + 1); for (int i = 1; i < cnt; i++) printf(" %d", res[i] + 1); printf("\n");}int main(){ while (scanf("%d%d", &n, &m) && (n || m)) { memset(gragh, 0, sizeof(gragh)); memset(indegree, 0, sizeof(indegree)); int a, b; for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); gragh[a-1][b-1] = 1; indegree[b-1]++; } toposort(); } return 0;}
阅读全文
0 0