ural 1022. Genealogical Tree

裸的拓扑排序。

 

昨晚btw一写,我才觉得,我以前写的拓排,真慢啊真慢。。

 

他直接用DFS盖时间戳了 。。。T T。。。

 

这个是btw的代码。。。

 

#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 static int g[N + 1][N + 1]; static int n; static int toporder[N + 1]; static int count; static char used[N + 1]; static void topsort(void); int main() { int t; int i; scanf("%d", &n); for (i = 1; i <= n; ++i) g[i][0] = 0; for (i = 1; i <= n; ++i) { while (scanf("%d", &t), t) g[i][++g[i][0]] = t; } topsort(); for (i = 0; i < n; ++i) printf("%d ", toporder[i]); putchar('/n'); return 0; } static void dfs(int p); static void topsort(void) { int i; memset(used, 0, sizeof(used)); count = n; for (i = 1; i <= n; ++i) { if (!used[i]) dfs(i); } } static void dfs(int p) { int i; used[p] = 1; for (i = 1; i <= g[p][0]; ++i) { if (!used[g[p][i]]) dfs(g[p][i]); } toporder[--count] = p; }  

 

这个是我的

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const int MAX = 110; int map[MAX][MAX]; int used[MAX]; int n; stack<int> s; void DFS(int x) { used[x] = 1; for(int i=1; i<=map[x][0]; i++) if( !used[map[x][i]] ) DFS(map[x][i]); s.push(x); } void topsort() { for(int i=1; i<=n; i++) if( !used[i] ) DFS(i); } int main() { int p; memset(map,0,sizeof(map)); memset(used,0,sizeof(used)); scanf("%d",&n); for(int i=1; i<=n; i++) while( scanf("%d",&p) && p ) map[i][++map[i][0]] = p; topsort(); while( !s.empty() ) { printf("%d ",s.top()); s.pop(); } printf("/n"); return 0; }  

你可能感兴趣的:(ural 1022. Genealogical Tree)