2017.10.12. 拓扑排序

拓扑排序

样题:

家谱树【拓扑排序模板】
题目描述
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息,输出一个序列,使得每个人的后辈都比那个人后列出。

输入格式
第 1 行一个整数 N(1<=N<=100),表示家族的人数。
接下来 N 行,第 I 行描述第 I 个人的儿子。
每行最后是 0 表示描述完毕。

输出格式
输出一个序列,使得每个人的后辈都比那个人后列出。
如果有多解输出任意一解。

样例数据 1
输入  [复制]

5
0
4 5 1 0
1 0
5 3 0
3 0
输出

2 4 5 3 1

std.cpp:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
#include<ctime>
using namespace std;

const int kkk = 150;

int n,k,x,u,v,val;
int first[kkk];
struct node{int u,v,val,next;}side[2*kkk];

int cnt=1;
void addedge(int u,int v,int val)
{
    side[++cnt].u = u;
    side[cnt].v = v;
    side[cnt].val = val;    
    side[cnt].next = first[u];
    first[u] = cnt;
}

bool visit[kkk];
int in[kkk],out[kkk];
void judge()
{
    int sum=0;
    while(sum!=n)
      for(u=1;u<=n;u++)
        if(!in[u]&&!visit[u])
        {
            visit[u] = true;
            cout << u << " ";
            for(int i=first[u];i;i=side[i].next)
            {
                v = side[i].v;
                in[v]--;
                out[u]--;
            }
            sum++;
        }

}

int main()
{
    cin >> n;
    for(u=1;u<=n;u++)
      while(cin>>v&&v)
      {
        addedge(u,v,1);
        in[v]++;out[u]++;
      }

    judge();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值