当前位置:网站首页>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;
}
边栏推荐
猜你喜欢
随机推荐
MLX90640 红外热成像仪测温传感器模块开发笔记(九)
Dataset:Medical Data and Hospital Readmissions医疗数据和医院再入院情况数据集的简介、下载、使用方法之详细攻略
企业如何走出固定资产管理的困境?
MySQL基础篇(三)-- 数据类型
【微信小程序】一文解决button、input、image组件
The torch using summary
第二轮Okaleido Tiger热卖的背后,是背后生态机构战略支持
学习的时候碰见的一个sql问题,希望大佬们可以解答一二?
苹果手机用久了卡顿,学会这样清理缓存,清理后和新机一样流畅
Bika LIMS 开源LIMS集—— SENAITE的使用(分析/测试、方法)
A recent paper summarizes
阿里巴巴 CTO 程立:开源是基础软件的源头!
如何监控海外服务器性能
gdb调试常用概念整理
轻松学Pytorch-Pytorch可视化
How Navicat Connects to MySQL
为什么用了大牌工具后报表开发依然头痛
图解 Attention(完整版)!
snap软件中哨兵2A数据预处理及六种常用植被指数的计算
Super young!34-year-old professor, vice president of 985 Ace College!








![[MySQL view] View concept, create, view, delete and modify](/img/dc/436dbaa0419b76cdab02a57436a782.png)
