zoj3820(树的直径的应用)

2024-09-09 17:18
文章标签 应用 直径 zoj3820

本文主要是介绍zoj3820(树的直径的应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。

思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。

代码如下:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#include <string>
#include <iostream>#define inf 0x3f3f3f3f
#define N 200005
using namespace std;
int head[N],tot;
struct node
{int v,next;
}edge[N<<1];
void addedge(int u,int v)
{edge[tot].next = head[u];edge[tot].v = v;head[u] = tot++;
}
int step[N],vis[N],pre[N];
int x,y;
int bfs(int u,int& cnt)
{memset(vis,0,sizeof(vis));queue<int> q;q.push(u);step[u] = 0;vis[u] = 1 ;pre[u] = -1;int now;while(!q.empty()){now = q.front();q.pop();for(int i = head[now]; i != -1; i = edge[i].next){int v = edge[i].v;if(vis[v])  continue;if(now == x && v == y)  continue;if(now == y && v == x)  continue;step[v] = step[now] + 1;//if(step[v] > ans)   ans = step[v];cnt = max(cnt,step[v]);vis[v] = 1;pre[v] = now;q.push(v);}}return now;
}
int find_node(int u,int dist)
{int cnt = 1;while(1){if(cnt == dist/2)   break;u = pre[u];cnt++;}return u;
}
int main()
{int t;scanf("%d",&t);while(t--){memset(head,-1,sizeof(head));tot = 0;  x = y = inf;int n;scanf("%d",&n);int i;for(i = 1; i < n; i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}int st = bfs(1,i);int ed = bfs(st,i);//cout<<st<<" "<<ed<<endl;//for(i = 1; i <= n; i++)//  cout<<step[i]<<" ";cout<<endl;//cout<<step[ed]<<endl;x = find_node(ed,step[ed]+2);y = pre[x];//找到要去除的边x - y//cout<<x<<" "<<y<<endl;int st1 = bfs(st,i);int ed1 = bfs(st1,i);int ans1 = find_node(ed1,step[ed1]+2);int st2 = bfs(ed,i);int ed2 = bfs(st2,i);int ans2 = find_node(ed2,step[ed2]+2);int ans = 0,temp = 0;bfs(ans1,temp);     ans = max(ans,temp);temp = 0;bfs(ans2,temp);     ans = max(ans,temp);printf("%d %d %d\n",ans, ans1,ans2);}return 0;
}


这篇关于zoj3820(树的直径的应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1151788

相关文章

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库