当前位置:网站首页>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;
}
边栏推荐
猜你喜欢
随机推荐
Dataset:FIFA 2018 Statistics数据集(Predict FIFA 2018 Man of the Match预测2018年国际足联最佳球员)的简介、下载、使用方法之详细攻略
线程池面试汇总
AI全流程开发难题破解之钥
何享健“A拆A”又败一局,美的旗下美智光电终止创业板IPO
leetcode链表专题
C# autoCAD 几个经常用到的功能代码。
传奇人形怪爆率怎么设置?人形怪增加教程
conda环境创建及复制
浅谈防勒索病毒方案之主机加固
如何监控海外服务器性能
新来技术总监:谁在用 isXxx 形式定义布尔类型,明天不用来了!
第二轮Okaleido Tiger热卖的背后,是背后生态机构战略支持
2022年年中总结:行而不辍,未来可期
常坐飞机的你,为什么老惦记着“升舱”?
苹果手机用久了卡顿,学会这样清理缓存,清理后和新机一样流畅
Vscode搭建ESP32-C3开发环境
【个人收藏】一些比较有用的链接
zabbix一键部署脚本----亲测可用
AutoAlignV2:多模态3D目标检测新SOTA!(ECCV2022)
Nacos分级存储模型-集群配置与NacosRule负载均衡