hdu 2196(方法1:经典树形DP+方法2:树的直径)
Computer
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5194 Accepted Submission(s): 2620
school bought the first computer some time ago(so this computer's id is
1). During the recent years the school bought N-1 new computers. Each
new computer was connected to one of settled earlier. Managers of school
are anxious about slow functioning of the net and want to know the
maximum distance Si for which i-th computer needs to send signal (i.e.
length of cable to the most distant computer). You need to provide this
information.
Hint:
the example input is corresponding to this graph. And from the graph,
you can see that the computer 4 is farthest one from 1, so S1 = 3.
Computer 4 and 5 are the farthest ones from 2, so S2 = 2. Computer 5 is
the farthest one from 3, so S3 = 3. we also get S4 = 4, S5 = 4.
file contains multiple test cases.In each case there is natural number N
(N<=10000) in the first line, followed by (N-1) lines with
descriptions of computers. i-th line contains two natural numbers -
number of computer, to which i-th computer is connected and length of
cable used for connection. Total length of cable does not exceed 10^9.
Numbers in lines of input are separated by a space.
1 1
2 1
3 1
1 1
2
3
4
4
///题意:求树上每个点到离它最远的点的距离.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 10050
using namespace std; struct Edge{
int u,v,w,next;
}edge[*N];
int head[N];
int dp[N][]; ///dp[i][0]代表以i为根子树中的最长路,dp[i][1]代表子树中的次长路,dp[i][2]代表父亲树中的最长路 void addEdge(int u,int v,int w,int &k){
edge[k].u = u,edge[k].v = v,edge[k].w = w;
edge[k].next = head[u],head[u]=k++;
} void dfs(int u,int fa){ ///找子树中的最大值和次大值
for(int k = head[u];k!=-;k=edge[k].next){
int v = edge[k].v;
if(v==fa) continue;
//printf("%d\n",v);
dfs(v,u);
if(dp[u][]<dp[v][]+edge[k].w){
dp[u][] = dp[v][] + edge[k].w;
if(dp[u][]>dp[u][]){
swap(dp[u][],dp[u][]);
}
}
}
}
void dfs1(int u,int fa){///找从父亲延伸过去的最大值
for(int k = head[u];k!=-;k=edge[k].next){
int v = edge[k].v,w = edge[k].w;
if(v==fa) continue;
dp[v][] = max(dp[u][] , dp[v][]+edge[k].w==dp[u][]?dp[u][]:dp[u][]) + edge[k].w;
dfs1(v,u);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-,sizeof(head));
memset(dp,,sizeof(dp));
int tot=;
for(int u=;u<=n;u++){
int v,w;
scanf("%d%d",&v,&w);
addEdge(u,v,w,tot);
addEdge(v,u,w,tot);
}
dfs(,-);
dfs1(,-);
for(int i=;i<=n;i++){
printf("%d\n",max(dp[i][],dp[i][]));
}
}
return ;
}
方法二:先对任意一个点进行搜索的到离它最远的端点,这个点必定是树的直径(树的直径指树中的最长路)的其中一个端点,然后以这个端点开始又进行搜索,得到一个离他最远
的店,这个点是直径的另外一个端点,我们在找的时候分别更新所有点到两个端点的距离,对于每个点我们区大值就是结果。
///题意:求树上每个点到离它最远的点的距离.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define N 10050
using namespace std; struct Edge{
int u,v,w,next;
}edge[*N];
int head[N]; void addEdge(int u,int v,int w,int &k){
edge[k].u = u,edge[k].v = v,edge[k].w = w;
edge[k].next = head[u],head[u]=k++;
}
int dis[N],dis1[N];
int vis[N];
void BFS(int x){
memset(vis,,sizeof(vis));
queue<int> q;
q.push(x);
vis[x]=;
while(!q.empty()){
int t = q.front();
q.pop();
for(int k=head[t];k!=-;k=edge[k].next){
int v = edge[k].v,w=edge[k].w;
if(!vis[v]){
vis[v]=;
q.push(v);
dis[v] =max(dis[v],dis[t]+w);
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-,sizeof(head));
memset(dis,,sizeof(dis));
memset(dis1,,sizeof(dis1));
int tot=;
for(int u=;u<=n;u++){
int v,w;
scanf("%d%d",&v,&w);
addEdge(u,v,w,tot);
addEdge(v,u,w,tot);
}
BFS();
int START=,END=;
int len = -;
for(int i=;i<=n;i++) {
if(dis[i]>len) {len = dis[i],START = i;}
}
memset(dis,,sizeof(dis));
BFS(START);
len = -;
for(int i=;i<=n;i++) {
dis1[i]=dis[i];
if(dis[i]>len) {len = dis[i],END = i;}
}
memset(dis,,sizeof(dis));
BFS(END);
for(int i=;i<=n;i++){
printf("%d\n",max(dis[i],dis1[i]));
} }
return ;
}
hdu 2196(方法1:经典树形DP+方法2:树的直径)的更多相关文章
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- HDU 4616 Game(经典树形dp+最大权值和链)
http://acm.hdu.edu.cn/showproblem.php?pid=4616 题意:给出一棵树,每个顶点有权值,还有存在陷阱,现在从任意一个顶点出发,并且每个顶点只能经过一次,如果经过 ...
- hdu 1054 Strategic Game 经典树形DP
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdoj3534(树形dp,求树的直径的条数)
题目链接:https://vjudge.net/problem/HDU-3534 题意:给出一棵树,求树上最长距离(直径),以及这样的距离的条数. 思路:如果只求直径,用两次dfs即可.但是现在要求最 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- HDU 1561 The more, The Better 经典树形DP
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 3534 Tree (经典树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...
随机推荐
- 【iOS开发】UIView之userInteractionEnabled属性介绍
http://my.oschina.net/hmj/blog/108002 属性作用 该属性值为布尔类型,如属性本身的名称所释,该属性决定UIView是否接受并响应用户的交互. 当值设置为NO后,UI ...
- 软工实践Beta冲刺(1/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- java线程(4)——线程同步的锁技术
同步 同步,字面来看,有点一起工作的意思.但在线程同步中,"同"意为协同.互相配合. 比如: A.B两个线程,并不是说两个线程必须同时一起工作,而是说互相配合工作,在某个时间可能线 ...
- To Chromium之VS调试追踪
启动的code: for(;;){...WaitForWork()}base.dll!base::MessagePumpForUI::DoRunLoop ...
- vue-cli配置jquery 以及jquery第三方插件
只使用jquery: 1. cnpm install jquery --save 2. cnpm install @types/jquery --save-dev (不使用ts的不需要安装此声明 ...
- java实现数据库连接的工具类
第一种 (带事务) package com.china.util; import java.sql.Connection; import java.sql.DriverManager; import ...
- 除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
- Web.config配置文件中的属性add,key,value含义
这是添加自定义字符串的方式,保存是以键-值的形式保存的,可以通过key获取value,一般用这种方法配置全局内使用的字符串. <configuration>是配置文件的根配置节. < ...
- Hibernate技术入门
ORM原理 ORM(Object Relational Mapping)是对象到关系的映射,它的作用是在关系数据库和对象之间做一个自动映射,将数据库中的数据表映射成对象(持久化类),对关系型数据库以对 ...
- 谈一谈深度学习之semantic Segmentation
上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...