题目链接:https://cn.vjudge.net/problem/POJ-2631

树的直径:树中的最长链

具体思路:随便找一个点bfs,然后找到最长的链,然后再以找到的点作为起点进行bfs,然后找到的最长的链就是树的直径。

AC代码:

#include<iostream>
#include<stack>
#include<iomanip>
#include<queue>
#include<iomanip>
#include<vector>
#include<map>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
# define maxn 10000+100
struct node
{
int to;
int cost;
int nex;
} edge[maxn];
int head[maxn],num;
int dis[maxn];
int vis[maxn];
int maxx;
void addedge(int fr,int to,int cost)
{
edge[num].nex=head[fr];
edge[num].to=to;
edge[num].cost=cost;
head[fr]=num++;
}
int bfs(int t)
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
queue<int>q;
q.push(t);
vis[t]=1;
maxx=0;
int index=t;
while(!q.empty())
{
int temp=q.front(); q.pop();
for(int i=head[temp]; i!=-1; i=edge[i].nex)
{int u=edge[i].to;
if(vis[u]==0)
{
vis[u]=1;
dis[u]=dis[temp]+edge[i].cost;
if(dis[u]>maxx)
{
maxx=dis[u];
index=u;
}
q.push(u);
} }
}
return index;
}
int main()
{
num=0;
memset(head,-1,sizeof(head));
int u,v,w;
// for(int i=1; i<=5; i++)
// {
// cin>>u>>v>>w;
// addedge(u,v,w);
// addedge(v,u,w);
// }
while(~scanf("%d%d%d",&u,&v,&w))
{
addedge(u,v,w);
addedge(v,u,w);
}
int temp=bfs(1);
bfs(temp);
printf("%d\n",maxx);
return 0;
}

树的直径(两个bfs)的更多相关文章

  1. POJ 1383题解(树的直径)(BFS)

    题面 Labyrinth Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 4997 Accepted: 1861 Descript ...

  2. poj--1383--Labyrinth(树的直径)

    Labyrinth Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 4062   Accepted: 1529 Descrip ...

  3. Building Fire Stations ZOJ - 3820 (二分,树的直径)

    大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...

  4. hdu 4612 Warm up 有重边缩点+树的直径

    题目链接 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tot ...

  5. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

  6. 树的直径+rmq+(伪)单调队列 -HDU4123

    给定一棵n个点并且有边权的树,每个点的权值为该点能走的最远长度,并输入m个询问,每次询问最多有多少个编号连续的点,他们的最大最小点权差小于等于Q.N<=50000 M<=500 Q< ...

  7. XTU1267:Highway(LCA+树的直径)

    传送门 题意 有n个小镇,Bobo想要建造n-1条边,并且如果在u到v建边,那么花费是u到v的最短路长度(原图),问你最大的花费. 分析 比赛的时候没做出来,QAQ 我们首先要找到树的直径起点和终点, ...

  8. 2021.08.09 P7238 迷失森林(树的直径)

    2021.08.09 P7238 迷失森林(树的直径) P7238 「DCOI」迷失森林 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树的直径两种求法:两次dfs.树 ...

  9. 两次bfs求树的直径的正确性

    结论:离树上任意点\(u\)最远的点一定是这颗树直径的一个端点. 证明: 若点\(u\)在树的直径上,设它与直径两个端点\(x,y\)的距离分别为\(S1\).\(S2\),若距离其最远的点\(v\) ...

随机推荐

  1. php 多维数组排序

    PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...

  2. Android性能测试工具:Emmagee介绍

    简介 Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具.该工具的优势在于如同windows系统性能监视器类似,它提供的是数据采集的功能,而行为则基于用户真实 ...

  3. 使用JMeter录制Web应用测试脚本

    环境 操作系统:Windows 7 工具:JMeter.Badboy 1. 使用代理录制Web性能测试脚本 使用代理录制脚本来创建测试计划无疑是一个简便的方法,代理所要完成的工作就是录制发往服务器的请 ...

  4. Java虚拟机内存模型和volatile型变量

    Java虚拟机内存模型 了解Java虚拟机的内存模型,有助于我们明白为什么会发生线程安全问题. 上面这幅图是<深入理解Java虚拟机-JVM高级特性与最佳实践>的书中截图. 线程共享的变量 ...

  5. python传参

    写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...

  6. [三]SpringBoot 之 热部署

    如下配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  7. Coding and Paper Letter(四十五)

    资源整理. 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型. 它还支持随机建模以解决参数和模型 ...

  8. 20165218 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.16 实验密级:Java开发环境的熟悉 实验内容.步骤与体会: ...

  9. C++11新利器

    C++11常用特性的使用经验总结 unordered_map可能用的会比较多 省的写哈希表了. 但是浪费空间

  10. 2018-2019 ACM-ICPC 沈阳赛区 K. Let the Flames Begin

    K. Let the Flames Begin 题目链接:https://codeforces.com/gym/101955/problem/K 题意: n个人围成一个圈,然后依次从1开始报数,报到k ...