很耿直的拓扑排序题,就当熟悉一下算法吧。。。
#include #include #include #include #include #include #include
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
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;}