当前位置: 代码迷 >> 综合 >> Genealogical tree POJ - 2367(topo 大水题)
  详细解决方案

Genealogical tree POJ - 2367(topo 大水题)

热度:84   发布时间:2024-02-27 21:02:33.0

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;
}
  相关解决方案