L2-026 小字辈——BFS DFS 并查集-三种方法
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
9
2 6 5 5 -1 5 6 4 7
输出样例:
4
1 9
DFS
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> v[N];
bool st[N];
int n,h;//h为最大深度
vector<int> res;void dfs(int u,int height)
{if (height>h){h=height;res.clear();}if (height == h) res.push_back(u);for (auto x : v[u])dfs(x, height + 1);
}
int main()
{cin >> n;for (int i = 1;i <= n;i++){ int t;cin >> t;if (t == -1) t = 0;//-1不可以作为下标,这里不妨改成0v[t].push_back(i);}dfs(0,1);//祖宗开始 高度为1cout << h-1 << endl;for(int i=0;i<res.size()-1;i++)cout<<res[i]<<" ";cout<<res[res.size()-1];
}
并查集
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int h[N], a[N];//h[x]辈分
int n;//存最大深度int find(int x)
{if (a[x] == -1) h[x] = 1;if (h[x] == 0) h[x] = find(a[x]) + 1;//这个h[x]==0防止过多的去迭代return h[x];
}int main()
{cin >> n;for (int i = 1;i <= n;i++)cin >> a[i];for (int i = 1;i <= n;i++) find(i);int hmax = 0;for (int i = 1;i <= n;i++)hmax = max(hmax, h[i]);cout<<hmax<<endl;int flag = 0;for (int i = 1;i <= n;i++){if (h[i] == hmax){if (!flag){cout << i;flag = 1;}else cout << " " << i;}}}
BFS
宽搜时,遍历子节点,子节点的辈分等于其父节点+1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> v[N];
int a[N];
int n;int main()
{cin >> n;int root;for (int i = 1;i <= n;i++){int t;cin >> t;if (t == -1) root=i;else v[t].push_back(i);}queue<int> q;q.push(root);a[root] = 1;while (q.size()){int t = q.front();q.pop();for (auto x : v[t]){a[x] = a[t] + 1;q.push(x);}}int hmax = 0;for (int i = 1;i <= n;i++){hmax = max(hmax, a[i]);}cout << hmax << endl;int flag = 0;for (int i = 1;i <= n;i++){if (a[i] == hmax){if (!flag){cout << i;flag++;}else cout << " " << i;}}
}
L2-026 小字辈——BFS DFS 并查集-三种方法相关推荐
- HDU-3974 Assign the task 线段树 或 直接模拟多叉树 或 并查集 (三种方法)
题目大意 t 组数据(t<=10),每组第一行一个 n 表示 n 个员工(n<=5e4),接下来 n-1 行,每行两个整数 u,v 表示 v 是 u 的上司 然后一行 m 表示有 m 个操 ...
- hdu1181变形课dfs/bfs/并查集三种解法(java)
题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...
- LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 2.3 并查集 1. 题目 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1. 线缆用 connection ...
- hdu dfs入门java_hdu1181变形课dfs/bfs/并查集三种解法(java)
题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...
- 并查集三种Java代码实现
@代码模板 package Algorithm;public class UF {private int[] id;//连通分量的idprivate int count;public UF(int n ...
- LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 2.3 并查集 1. 题目 给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢 ...
- 小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)
(https://acm.ecnu.edu.cn/contest/173/problem/C/) 题目大意: 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于每个点? ...
- LeetCode547. Friends Circles 利用union find | bfs | dfs三种方法解决
问题来源 此题来源于LeetCode547. Friend Circles,主要运用了并查集(union find).广度优先遍历(bfs)和深度优先遍历(bfs)三种方法解决. 问题简述 给定一个N ...
- 广度优先搜索(BFS)最短路径输出表示(三种方法)
相信我,看完之后,你会对BFS有种全新的了解,彻底掌握BFS 只需要这一篇就足够啦,狗头 BFS路径表示 广度优先搜索顾名思义就是以迷宫里的无向图某一个点,借助队列,一层一层以该点为中心散开进行搜索, ...
最新文章
- 中介分析 相对直接效应 相对简介效应_中介效应分析方法和流程
- poi xwpf 转换成 html,Apache POI创建的docx文档无法转化成html
- scratch desktop的基本使用 - 舞台坐标系
- 使用线程,防止当前程序被阻塞
- 【博客大赛】使用LM2677制作的3V至24V数控可调恒压源
- 从ISO 文件制作U盘启动盘.
- APUE C内存空间详解图
- 深度理解 RGMII (包含Linux和realtek)
- pid双闭环matlab仿真,SPWM波控制单相逆变器双闭环PID调节器的Simulink建模与仿真
- 皮克定理和任意多边形的面积公式
- 如何通俗的解释全微分?
- Windows蓝屏自动修复无法修复你的电脑
- Android解析域名获取IP
- scrapy框架爬取斗鱼女主播照片,依据颜值排行榜
- Tomcat 在IE中下载rar文件直接以乱码方式打开解决方案
- 会员等级进度功能前端实现
- 远程控制计算机控制不,远程控制电脑为什么打不了字
- 三菱FX系列DPLSY指令使用
- 线程wait、join用法
- 苏州事业单位专技岗面试经历