首页 > 其他分享 >1021 Deepest Root(树的直径、bfs/dfs、并查集)

1021 Deepest Root(树的直径、bfs/dfs、并查集)

时间:2024-11-19 21:08:11浏览次数:1  
标签:1021 temp int 查集 dfs parents 端点 直径

 先通过并查集判断有几个连通图,如果只有一张图,那就用两次dfs/bfs来找到树的直径上的所有端点

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 vector<int> edges[10005];
 5 bool visited[10005] = {false};
 6 set<int> temp; //记录该次dfs筛选出树直径上的端点
 7 set<int> res; //所有树直径上的端点
 8 vector<int> parents(10005); //父节点,用于并查集
 9 int maximum = -1;
10 int find(int x) {
11     if (x == parents[x]) {
12         return x;
13     }
14     parents[x] = find(parents[x]); //路径压缩
15     return parents[x];
16 }
17 void merge(int a, int b) {
18     int pa = find(a);
19     int pb = find(b);
20     if (pa != pb) {
21         parents[pb] = pa;
22     }
23 }
24 
25 void dfs(int p, int level) {
26     if (level > maximum) {
27         temp.clear();
28         temp.insert(p);
29         maximum = level;
30     } else if (level == maximum) {
31         temp.insert(p);
32     }
33     visited[p] = true;
34     for (auto i : edges[p]) {
35         if (!visited[i]) {
36             dfs(i, level + 1);
37         }
38     }
39 }
40 int main() {
41     cin >> n;
42     int a, b;
43     for (int i = 1; i <= n; ++ i) {
44         parents[i] = i;
45     }
46     for (int i = 0; i < n - 1; ++ i) {
47         cin >> a >> b;
48         edges[a].push_back(b);
49         edges[b].push_back(a);
50         merge(a,b);
51     }
52     int components = 0;
53     for (int i = 1; i <= n; ++ i) {
54         if (find(i) == i) {
55             components ++;
56         }
57     }
58     if (components > 1) {
59         printf("Error: %d components", components);
60         return 0;
61     }
62     int root = 1;
63     dfs(root, 0); //第一次dfs用于找到树直径上的端点
64     for (auto i : temp) {
65         res.insert(i);
66         root = i; //取任意一个树直径上的端点
67     }
68     memset(visited, false, sizeof(visited));
69     temp.clear();
70     dfs(root, 0); //以树直径上的端点为根进行遍历,得到所有树直径上的端点
71     for (auto i : temp) {
72         res.insert(i);
73     }
74     for (auto i : res) {
75         cout << i << endl;
76     }
77 
78 }

 

标签:1021,temp,int,查集,dfs,parents,端点,直径
From: https://www.cnblogs.com/coderhrz/p/18555606

相关文章

  • 关于HDFS路径文件夹名称的问题
    问题发现​ 最开始的需求:修改/origin_data/gmall/db目录下所有以inc结尾的文件夹里的文件夹(名称为2024-11-15)修改为2020-6-14问gpt写了个脚本:#!/bin/bash#遍历/origin_data/gmall/db下所有以"inc"结尾的文件夹fordirin$(hdfsdfs-ls/origin_data/gmall/db|grep......
  • FA 科技:一种基于换根 + DFS 序的点分治下下位替代
    起因:cjx暑假集训的时候出了道题,老师说可以点分治。但是我最初的想法其实是换根处理,但怎么想发现都行不通,因为要同时维护DFS序和权值。于是就没想了。后来10.5和xyh进行长达30s的讨论导游的工作那题,说了我这个想法,xyh觉得有道理,对要求解的问题具体化,于是我才想出了分块......
  • 倒序处理、并查集
    倒序处理[USACO22JAN]FarmUpdatesG题目描述FarmerJohn经营着总共NNN个农场(1≤......
  • 1018 Public Bike Management(多条最短路径,dijkstra+dfs+回溯)
     该题考查多条最短路径的计算,对比单条最短路,主要有两点不同:1.在dijkstra算法中记录每个结点的所有相同最短距离的前结点2.在dfs找多条最短路径时需要回溯状态拿到所有最短路径以后,我们根据题意去获取相应的结果即可1#include<bits/stdc++.h>2usingnamespacestd;......
  • 学习笔记(算法)——路径之谜(蓝桥杯官网)(dfs,回溯)
    学习+1学习目标:蓝桥杯省奖学习内容:每日一题题目源于蓝桥杯官网题目描述解题思路1.先定义最大行列值,输入行列值,行列靶数,答案数组,访问标记数组,辅助数组2.定义dfs(深度优先搜索)函数2.1记录当前位置2.2如果到达右下角&&行列只剩一靶2.2.1做循环:如果前面的靶子都打......
  • 食物链(并查集)
    题目:https://ac.nowcoder.com/acm/contest/22904/1024思路:这道题网络上有很多思路,可以开三个并查集,可以使用带权并查集,但是有一个大佬的思路是这样的,将总结点的数量增加到3n个,把整个节点区域分为n,2*n,3*n三个部分,我们可以物种a的一个节点对应物种b的两个节点,如果是同类,我们就把他......
  • 在 Windows 系统中,DFS (Distributed File System) 是一种用于文件共享和管理的技术,能
    在Windows系统中,DFS(DistributedFileSystem)是一种用于文件共享和管理的技术,能够让多个服务器上的共享文件夹(共享资源)通过一个统一的命名空间来访问。DFS主要通过DFS命名空间和DFS复制这两个组件来实现。DFS相关命令和功能在Windows中,DFS相关的命令通常是通过......
  • 并查集+最小生成树 学习笔记+杂题 2
    图论系列:前言:相关题单:戳我算法讲解:戳我CF1829ETheLakes给定一张\(n*m\)的矩阵,询问正整数四联通块权值和的最大值。并查集维护即可,记录一下集合内的点的权值和。代码:constintM=1005;intT,n,m,ans;inta[M][M],fa[M*M],siz[M*M];intfx[5]={0,1,-1,0,0};intfy[5]......
  • 并查集+最小生成树 学习笔记+杂题 1
    图论系列:前言:相关题单:戳我算法讲解:戳我代码可能过多啊,到时候页面别卡死了,所以就把代码最前面的缺省源删了(反正就是几个头文件/defineintlonglong,自己加一下即可)。并查集记得初始化,最小生成树记得排序。P3367【模板】并查集板子题,给定\(n\)个元素,有2种操作,一种合并,......
  • 并查集 How many tables(hdu 1213) How many answers are wrong(hdu 3038)
    目录前言并查集  并查集的初始化  并查集的合并  并查集合并的优化,路径压缩Howmanytables(hdu1213)  问题描述  输入  输出问题分析代码带权并查集Howmanyanswersarewrong(hdu3038)  问题描述  输入  输出问题分析代码......