当前位置:网站首页>1191. 家谱树
1191. 家谱树
2022-07-29 13:16:00 【追寻远方的人】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的孩子都比那个人后列出。
输入格式
第 1 行一个整数 n,表示家族的人数;
接下来 n 行,第 i 行描述第 i 个人的孩子;
每行最后是 0 表示描述完毕。
每个人的编号从 1到 n。
输出格式
输出一个序列,使得每个人的孩子都比那个人后列出;
数据保证一定有解,如果有多解输出任意一解。
数据范围
1≤n≤100
输入样例:
5
0
4 5 1 0
1 0
5 3 0
3 0
输出样例:
2 4 5 3 1
代码:
/* 思考:如何输出字典序最小的拓扑排序? 将队列换成优先队列,优先队列取出的元素是当前字典序最小的编号,在出队的时候记录出队的编号即为当前字典序最小的拓扑序,此方法的时间复杂度是O(logn∗(n+m)) 或者邻接矩阵 */
#include <bits/stdc++.h>
using namespace std;
const int N = 110, M = N * N / 2;
int h[N], e[M], ne[M], idx;
int n;
int q[N];
int d[N];
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void topsort()
{
int hh = 0, tt = -1;
for (int i = 1; i <= n; i++)
{
if (!d[i])
q[++tt] = i;
}
while (hh <= tt)
{
int t = q[hh++];
for (int i = h[t]; ~i; i = ne[i])
{
int j = e[i];
if (--d[j] == 0)
q[++tt] = j;
}
}
}
int main()
{
cin >> n;
memset(h, -1, sizeof h);
for (int i = 1; i <= n; i++)
{
int son;
while (cin >> son, son)
{
add(i, son);
d[son]++;
}
}
topsort();
for (int i = 0; i < n; i++)
printf("%d ", q[i]);
return 0;
}
边栏推荐
猜你喜欢
随机推荐
Meta,元宇宙和广告双败的一季
关于知识付费的一些思考
2022年七夕情人节有什么值得推荐的礼物选择?实用且高级礼物推荐
今日睡眠质量记录没有
mysql 存储过程详解
阿里云官方 Redis 开发规范!
[网鼎杯 2020 半决赛]AliceWebsite
每日优鲜解散疑云:生鲜电商们苦渡生死劫
38.【string下章】
JS_ deleting the invalid data in the array undefined '0' null false NaN
理解yolov7网络结构
snap软件中哨兵2A数据预处理及六种常用植被指数的计算
来自 Qt 官网的呐喊
Leetcode67. 二进制求和
gee引擎修改UI界面图文教程
一口气说出4种主流数据库ID自增长,面试官懵了
zabbix一键部署脚本----亲测可用
线程池面试汇总
【个人收藏】一些比较有用的链接
JUC阻塞队列-ArrayBlockingQueue









