<题目链接>

题目大意:

给定一颗树,求出树的直径。

解题分析:
树的直径模板题,以下程序分别用树形DP和两次BFS来求解。

树形DP:

#include <cstdio>
#include <algorithm>
using namespace std; const int N = 1e5+;
struct Edge{
int to,val,nxt;
Edge(int _to=,int _val=,int _nxt=):to(_to),val(_val),nxt(_nxt){}
}e[N<<];
int n,m,cnt,ans;
int dp1[N],dp2[N],head[N];
//dp1[u]维护以u为根的子树最长链的长度
//dp2[u]维护以u为根的子树次长链的长度,并且最长链与次长链不重合
inline void add(int u,int v,int w){
e[++cnt]=Edge(v,w,head[u]);
head[u]=cnt;
}
void dfs(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,cost=e[i].val;
if(v==fa)continue;
dfs(v,u);
if(dp1[v]+cost>dp1[u])dp2[u]=dp1[u],dp1[u]=dp1[v]+cost;
else if(dp1[v]+cost>dp2[u])dp2[u]=dp1[v]+cost;
}
ans=max(ans,dp1[u]+dp2[u]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int u,v,c;char ch;scanf("%d%d%d %c",&u,&v,&c,&ch);
add(u,v,c);add(v,u,c);
}
dfs(,-);
printf("%d\n",ans);
}

BFS

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1e5+;
int n,m,cnt,ans,res; struct Edge{
int to,val,nxt;
Edge(int _to=,int _val=,int _nxt=):to(_to),val(_val),nxt(_nxt){}
}edge[N<<];
int head[N],d[N],vis[N]; inline void add(int u,int v,int w){
edge[++cnt]=Edge(v,w,head[u]);head[u]=cnt;
}
void bfs(int s){
memset(vis,,sizeof(vis));
queue<int>que;
vis[s]=;d[s]=;
que.push(s);
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head[u]; i; i=edge[i].nxt){
int v=edge[i].to;
if(!vis[v]){
d[v]=d[u]+edge[i].val;
vis[v]=;
que.push(v);
if(d[v]>ans) //更新最远距离
ans=d[v],res=v;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int u,v,w;char ch;scanf("%d%d%d %c",&u,&v,&w,&ch);
add(u,v,w);add(v,u,w);
}
bfs();bfs(res); //两遍BFS,第一遍求出直径上的一个端点,第二遍求出另一个端点
printf("%d\n",ans);
}

最新文章

  1. SharePoint 2007 User Re-created in AD with new SID issue on MySite
  2. python设计模式
  3. 攻城狮在路上(壹) Hibernate(五)--- 映射一对多关联关系
  4. Blackfin DSP(二):寄存器操作与GPIO
  5. iso socket基础2
  6. Spring Boot 1 创建Demo
  7. Vue.js学习 Item5 -- 计算属性computed与$watch
  8. REST和SOAP
  9. hdu2011java
  10. ashx ajax 与 自定义javascript函数
  11. 【01-14】java ThreadLocal工具类
  12. iOS申请真机调试证书 -- 图文详解
  13. 同一个服务器部署两个Tomcat并用Nginx实现反向代理
  14. 深入理解SpringBoot之启动探究
  15. Ansible之playbook的使用总结 - 运维笔记
  16. ORA-16447 Redo apply was not active at the target standby database
  17. 关于新加坡IT薪酬和找工作网站
  18. 自制hashmap
  19. Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
  20. 微信公众平台如何与Web App结合?

热门文章

  1. MT【317】两次判别式
  2. MongoDB介绍与安装
  3. MySQL安装-二进制软件包安装
  4. 金融量化分析【day113】:聚宽自带策略
  5. Client-Side Template Injection with AngularJS
  6. Linux 命令详解(十三)如何启动、关闭和设置ubuntu防火墙
  7. 第二节:重写(new)、覆写(overwrite)、和重载(overload)
  8. [物理学与PDEs]第1章第3节 真空中的 Maxwell 方程组, Lorentz 力 3.1 真空中的 Maxwell 方程组
  9. 2.13 break和continue
  10. Leetcode#88. Merge Sorted Array(合并两个有序数组)