poj 2367 Genealogical tree
题目链接:http://poj.org/problem?id=2367
题意:拓扑排序。
分析:题目中说必定存在一种排列满足,所以直接做,最后也不用判断是否全为0。(邻接表存起来,后者入度,然后度为零输出,入队列,队列中利用邻接表遍历。)
代码:
#include<cstdio> #include<cmath> #include<cstring> #include<queue> #include<stack> #include<cstdlib> #include<string> #include<vector> #include<map> #include<string> #include<iostream> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f typedef long long ll; #define Max(a,b) (a>b)?a:b #define lowbit(x) x&(-x) struct ss { int a,next; } e[100005]; int head[100005],hx; int main() { hx=0; memset(head,-1,sizeof(head)); int n,du[105]= {0}; scanf("%d",&n);int t; for(int i=1; i<=n; i++) { while(~scanf("%d",&t)&&t) { e[hx].a=t; e[hx].next=head[i]; head[i]=hx++; du[t]++; } } queue<int>q; int flag=1; for(int i=1; i<=n; i++) { if(du[i]==0) { if(flag==1) flag=0; else printf(" "); printf("%d",i); q.push(i); } } while(!q.empty()) { t=q.front(); // printf("**%d**",t); q.pop(); for(int i=head[t]; i!=-1; i=e[i].next) { t=e[i].a; du[t]--; if(du[t]==0) { printf(" %d",t); q.push(t); } } } puts(""); }