Genealogical tree POJ - 2367
题意:
进行topo的模板题。
思路:
入度为0的点先出。
AC
#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fzhead EDGE(int _to, int _next)
#define fzbody to(_to), next(_next)
using namespace std;
const int maxn=1e2+10;
const int maxm=1e4+10;
struct EDGE{
int to,next;EDGE(){
}fzhead:fzbody{
}
}e[maxm];
int cnt=0;
int n,m;
int head[maxn],vis[maxn],in[maxn];
void add(int bg, int to){
e[cnt]=EDGE(to,head[bg]);head[bg]=cnt++;
}
priority_queue<int>q;
void topo(){
while(!q.empty()){
int u=-q.top();q.pop();cout<<u<<' ';for(int i=head[u]; i!=-1; i=e[i].next){
int v=e[i].to;if(in[v]==0)continue;in[v]--;if(in[v]==0)q.push(-v);}}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;mst(head,-1);For(i,1,n){
int u,v;u=i;while(cin>>v,v)add(u,v),in[v]++;}//cout<<"ok"<<endl;For(i,1,n)if(in[i]==0)q.push(-i);topo();return 0;
}