POJ 2367 Genealogical tree
很耿直的拓扑排序题,就当熟悉一下算法吧。。。
#include<iostream> #include<algorithm> #include<vector> #include<string> #include<stack> #include<queue> #include<map> #include<set> #include<cstdio> #include<cstring> #include<cmath> #define FF(i, a, b) for(int i=a; i<b; i++) #define FD(i, a, b) for(int i=a; i>b; i--) #define REP(i, n) for(int i=0; i<n; i++) #define CLR(a, b) memset(a, b, sizeof(a)) #define LL long long using namespace std; const int maxn = 111; int n, v, in[maxn], tot, ans[maxn]; vector<int> G[maxn]; inline void init() { REP(i, maxn) G[i].clear(); CLR(in, 0); tot = 0; } inline void add(int u, int v) { G[u].push_back(v); in[v]++; } void topo() { queue<int> q; FF(i, 1, n+1) if(!in[i]) q.push(i); while(!q.empty()) { int u = q.front(); q.pop(); ans[tot++] = u; int nc = G[u].size(); REP(i, nc) { int v = G[u][i]; in[v]--; if(!in[v]) q.push(v); } } } int main() { while(~scanf("%d", &n)) { init(); FF(i, 1, n+1) while(scanf("%d", &v), v) add(i, v); topo(); REP(i ,n) printf("%d%c", ans[i], i == n-1 ? '\n' : ' '); } return 0; }