[POJ-2631] 求树的直径

C++剑指offer:[POJ]2631 Roads in the North - 用树形DP的方式求出一棵树的直径 前言 此题是道很简单的题(做法不单一,不仅只有树形DP的方法) 做完了这道题才发现此题原来是一道求树的直径的题,也就是求树上两个节点的最大距离。 题目 问题 N(2692): [POJ2631]北极地区的路 时间限制:1 Sec内存限制:128 MB 题目描述 寒冷、人烟稀少的北极地区修建与维护道路时非常昂贵的。因此,修路时只会在任意两个村子之间形成一条唯一的路径,并且中途... 阅读详情

如何求树的直径我就不说了。

AC此题后有两点感悟:1. 通过边集来存储图(如何查找) 2. 先想清楚再编码,否则会一塌糊涂

/*
 * POJ-2631
 * mike-w
 * 2012-10-10
 * ******************************
 * find the diameter of a tree
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 11111
#define QSIZE 22222
#define INF 9999999
#define xDISP_GRAPH
#define xFOO_DEBUG

int maxn;
int edge[MAXSIZE][3], head[MAXSIZE], lsize;
int que[QSIZE], qhead, qtail, qlen;
int tag[MAXSIZE];

int comp(const void *e1, const void *e2)
{
	return *((int*)e1) - *((int*)e2);
}

int build_graph(void)
{
	int i;
	qsort(edge, lsize, sizeof(int[3]), comp);
	memset(head, -1, sizeof(head));
	head[edge[0][0]]=0;
	for(i=1; i<lsize; i++)
		if(edge[i][0]!=edge[i-1][0])
			head[edge[i][0]]=i;
	head[maxn+1]=lsize;
	return 0;
}

int enque(int x)
{
	que[qtail++]=x;
	qtail%=QSIZE;
	qlen++;
	return 0;
}

int deque(void)
{
	int ret=que[qhead++];
	qhead%=QSIZE;
	qlen--;
	return ret;
}

int bfs(int src)
{
	int i, x;
	memset(tag, 0, sizeof(tag));
	tag[src]=1;
	qhead=qtail=qlen=0;
	enque(src);
	while(qlen>0)
	{
		x=deque();
		for(i=head[x]; edge[i][0]==edge[head[x]][0]; i++)
			if(!tag[edge[i][1]])
			{
				tag[edge[i][1]]=edge[i][2]+tag[x];
				enque(edge[i][1]);
			}
	}
	return 0;
}

int max(int e1, int e2)
{
	return e1>e2?e1:e2;
}

#ifdef DISP_GRAPH
int disp_graph(void)
{
	int i, j;
	puts("*GRAPH+++++++++++++++++++++++++++");
	for(i=0; i<=maxn; i++)
		if(head[i]>=0)
		{
			printf("* %2d +\n", i);
			for(j=head[i]; edge[j][1]==edge[head[i]][1]; j++)
				printf("     |- %2d (len=%2d)\n", edge[j][1], edge[j][2]);
		}
	putchar('\n');
	return 0;
}
#endif

int main(void)
{
	int t1, t2, t3, i, maxl, maxi;

	while(scanf("%d%d%d", &t1, &t2, &t3)!=EOF)
	{
		edge[lsize][0]=t1;
		edge[lsize][1]=t2;
		edge[lsize][2]=t3;
		lsize++;
		edge[lsize][0]=t2;
		edge[lsize][1]=t1;
		edge[lsize][2]=t3;
		lsize++;
		maxn=max(max(t1, t2), maxn);
	}
	build_graph();
#ifdef DISP_GRAPH
	disp_graph();
#endif

	bfs(edge[0][0]);
	maxl=0, maxi=0;
	for(i=0; i<=maxn; i++)
		if(tag[i]>maxl)
			maxl=tag[i], maxi=i;
#ifdef FOO_DEBUG
	printf("one point of the diameter = %d\n", maxi);
#endif

	bfs(maxi);
	maxl=0;
	for(i=0; i<=maxn; i++)
		if(tag[i]>maxl)
			maxl=tag[i], maxi=i;
#ifdef FOO_DEBUG
	printf("the other point of the diameter = %d\n", maxi);
#endif
	printf("%d\n", maxl-1);
	return 0;
}


 

别再乱提MR了!手把手教你配置GitLab的CI/CD与分支保护规则,让团队协作更丝滑 本文详细介绍了如何配置GitLab的CI/CD与分支保护规则,以优化团队协作流程。通过设置Protected Branches、MR流水线检查和自动化审批规则,有效防止不规范操作和合并冲突,提升开发效率与代码质量。特别强调MR(Merge Request)的正确使用,确保团队协作更丝滑。 阅读详情

相关推荐

基于虚拟阻抗重塑的构网型VSG变流器SISO序阻抗建模与宽频振荡抑制策略分析(面向高比例新能源并网场景)

本文深入探讨了基于虚拟阻抗控制的构网型VSG变流器SISO序阻抗建模技术及其在高比例新能源并网场景中的宽频振荡抑制策略。通过虚拟阻抗重塑,有效改善了变流器的阻抗特性,解决了次/超同步频段的振荡问题,并提供了参数设计、阻抗扫频验证等实用技巧,为新能源并网系统的稳定性提供了可靠解决方案。

weixin_29268385的博客 249

POJ 1985 Cow Marathon(树的直径)

树的直径 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和。树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。后者通常也可称为直径,即直径是一个数值概念,也可代指一条路径。 求法 先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径。可以用两次dfs先搜到1号点距离最长的点p,然后在搜到p距离最...

H4ppyD0g的博客 386

光伏系统选型指南:5种主流MPPT算法优缺点对比(附选型流程图)

本文深入剖析了光伏系统中五种主流MPPT算法的核心原理与性能差异。通过对比扰动观察法、电导增量法、恒定电压法、模糊逻辑控制及人工智能算法在追踪精度、响应速度、实现成本与稳定性等方面的表现,为不同应用场景(如户用、工商业及大型电站)提供了清晰的选型决策流程图和实战指南,帮助工程师优化系统效率与投资回报。

weixin_29294597的博客 106

poj 2631 Roads in the North(裸树的直径)

Description Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a

小张的专栏 793

CST实战:变容二极管电容曲线提取全流程(附S参数设置技巧)

本文详细介绍了在CST Studio Suite中提取变容二极管电容-电压(C-V)曲线的完整实战流程。重点解析了S参数仿真的核心原理、DCFEED模块的正确配置、参数扫描的设置技巧,并探讨了集成SPICE模型进行精确仿真的方法,帮助射频工程师高效、准确地获取器件关键特性。

weixin_29237635的博客 529

python docx设置标题中文字体rPr.rFonts.set(qn(‘w:eastAsia‘),u‘黑体‘),报错‘NoneType‘ object has no attribute ‘set‘

一、我的代码: 因为要编一个报告自动化生成的代码,所以用了python docx,在设置标题自己写了一段代码,要求将标题设置成:一级标题 黑体 小四 from docx import Document from docx.oxml.ns import qn from docx.shared import Pt def add_Head(document, level, text, font, size): # document word对象 # level 几级标题 # text 标题内容 # f

qq_40272386的博客 8844

POJ 2631 树的直径

树的直径 问题:树的直径定义为一棵树上两个节点间的路径长度的最大值。 分析: 树形 dp:我们以任意一个点为根,向下进行遍历。经过 u 点,而不经过其父节点的最长路 径的两个端点,一定是在他的不同的子树中的两个叶子节点,因此我们可以记录 u 点的各个子 树的深度的最大值和次大值。累加即为经过这个节点时的最长路经长度。当然最长路径也可能从 父节点经过,那就是父节点的问题了。最后输出所有点最大值和次大...

qq_38472193的博客 441

小米路由器R1D进阶玩法:MIXBOX工具箱安装与插件管理指南

本文详细介绍了为小米路由器R1D安装MIXBOX工具箱的完整指南。通过开启SSH、执行一键安装脚本,用户可以轻松解锁路由器的进阶功能,如安装离线下载、内网穿透等插件,从而将旧设备转变为强大的家庭网络服务中心。

weixin_29292431的博客 1110

【数据结构】POJ 1985 Cow Marathon(树的直径)

链接: http://poj.org/problem?id=1985 题意: 有 nnn 个农场和 mmm 条路,以及每条路的方向(方向在这道题中没有用)。并且每对农场之间只有一条路可达,即这是一个树。求最长的一条路,也就是两点间的最大距离,即树的直径。 思路: 树的直径: 树的最长简单路(树中所有路径的最大值)。 求解方法: 跑两遍 BFS。第一遍 BFS 先任选一个起点,BFS 找到最长路的终...

Krone_的博客 335

cannot import name ‘BUFSIZE‘ from ‘numpy‘ 解决方案

本文主要介绍了cannot import name ‘BUFSIZE’ from ‘numpy’ 解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 22万+

基于AI大模型实现自然语言转SQL、SQL解释、SQL优化和SQL转换

随着大数据和人工智能技术的发展,数据分析和数据挖掘在各行各业中的应用越来越广泛。SQL(Structured Query Language)作为关系数据库的查询语言,是数据分析的重要工具。然而,SQL语言的复杂性和专业性使得许多非技术背景的用户难以直接使用,阻碍了数据的广泛利用。为了降低SQL的使用门槛,许多研究者和企业开始探索如何通过自然语言处理(NLP)技术,将自然语言转化为SQL查询语句,从而让用户可以通过自然语言与数据库进行交互。

AI天才研究院 2238

[树上DP] POJ2631 树的最长路径(最远点对)

题目 对于一棵n个结点的无根树,找到一条最长路径。换句话说,要找到两个点,使得它们的距离最远。 POJ2631 思路 和树的重心问题一样,先把无根树转成有根树。对于任意结点i,经过i的最长路就连接i的两棵不同子树u和v的最深叶子的路径。 基本的求法是,先随便找一个点作为根结点转换为无根树后,遍历每一个点,找出当i为根结点时的子树到叶子的最大距离d(j),在根据d(j)求出结点i作...

OI - IceCab 3242

WorkBuddy 连接百度网盘:能查能上传,但别指望 AI 帮你下载

本文介绍了如何通过WorkBuddy连接百度网盘实现文件管理功能。首先需要在百度开放平台创建应用并获取AppKey等凭证,然后通过拼接授权URL获取Access Token并填入WorkBuddy。实际测试表明,该连接器支持查看目录结构、搜索文件及上传文档,但无法实现文件下载和创建分享链接,原因是百度网盘MCP Server未提供相关接口。使用前需明确功能限制,该方案适合需要远程查阅网盘内容但不涉及下载的场景。

u011186532的专栏 1881

POJ-2631.Roads in the North(求树的直径)

2631.Roads in the North Description Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route...

紫藤&code的博客 224

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

POJ - 2631 Roads in the North ( 求树的直径)

题目链接 Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a village t...

c3po 156

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

poj2631 Roads in the North(求树的直径裸题)

两遍bfs求树的直径(就是树上的最长链) 这里给出树的直径的证明: 主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路。 证明:    1.设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则 d

Icefox的博客 495

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

POJ 2631 Roads in the North (求树的直径)

Description Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to ...

weixin_34153893的博客 83

poj2631 Roads in the North(求树的直径)

Roads in the North Time Limit:1000MS Memory Limit:65536K Total Submissions:2941 Accepted:1447 Description Building and maintaining roads among communities in the...

weixin_30354675的博客 51

POJ 1895 Cow Marathon&&POJ 2631 树的直径

1895这个题输入的方向是没用的,就是给出一棵树,求树的直径。 2631 中n是1W,m没给出,是个单实例,注意边数是0要输出0. 所谓树的直径就是一棵树中距离最远的两点的长度. 先从任意一点开始bfs,找到距离其最远的点x,那么x就是直径的一个端点,从x出发bfs一发找到最远的距离就是树的直径。 证明网上一大堆,善用baidu.. #include #include #include

417

poj2631 Roads in the North(树的直径)

题意:求树的直径。 #include <iostream> #include <algorithm> #include <cstring> #define maxn 401000*11 #define ll long long using namespace std; const int N = 1e5 + 10; int n, h[N], cnt, x, ...

Endeavor_G的博客 273

【POJ2631】Roads in the North 树的直径

题目大意:给定一棵 N 个节点的边权无根树,求树的直径。 代码如下 #include <cstdio> #include <algorithm> using namespace std; const int maxn=1e4+10; struct node{ int nxt,to,w; }e[maxn<<1]; int tot=1,head[...

K1385170的博客 212

poj2631 Roads in the North 树的直径

http://www.elijahqi.win/archives/941 Description Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is...

Elijahqi 206

POJ-2631-Roads in the North-树的直径(最长路)

http://poj.org/problem?id=2631 裸的求树直径, 两次bfs 这种方法是利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点。这样就可以首先任取一个点,bfs求出离其最远的点,在用同样的方法求出离这个叶子节点最远的点,此时两点间的距离就是树的直径。 #include #include #include #include

缺氧 533

POJ2631Roads in the North(树的直径)

Description Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a vi

菜鸟的自我修养 879

poj 2631 Roads in the North 【树的直径裸题】

Roads in the North Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2350   Accepted: 1152 Description Building and maintaining roads among communities in the

世界很大 557

POJ 2631 Roads in the North (树的直径)

题意: 给定一棵树, 求树的直径。 分析: 两种方法: 1.两次bfs, 第一次求出最远的点, 第二次求该点的最远距离就是直径。 2.同hdu2196的第一次dfs, 求出每个节点到子树的最长距离和次长距离, 然后某个点的最长+次长就是直径。 #include<stdio.h> #include<vector> #include<algo...

dixianqi2609的博客 141
上一篇: 调试心得——以HDU-1010为例
下一篇: NLOG 最长不下降子序列
creativewang
博客等级 码龄17年 20粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值