Hrbust 1750 Eternal Victory【贪心+Dfs】
2017-03-19 13:10
459 查看
Eternal Victory | ||||||
| ||||||
Description | ||||||
Valerian was captured by Shapur. The victory was such a great one that Shapur decided to carve a scene of Valerian's defeat on a mountain. So he had to find the best place to make his victory eternal! He decided to visit all n cities ofPersiato find the best available mountain, but after the recent war he was too tired and didn't want to traverse a lot. So he wanted to visit each of these n cities at least once with smallest possible traverse. Persian cities are connected with bidirectional roads. You can go from any city to any other one using these roads and there is a unique path between each two cities. All cities are numbered 1 to n. Shapur is currently in the city 1 and he wants to visit all other cities with minimum possible traverse. He can finish his travels in any city. Help Shapur find how much He should travel. | ||||||
Input | ||||||
There are multiple test case, process to the end of file. First line contains a single natural number n (1 <= n <= 100,000) — the amount of cities. Next n - 1 lines contain 3 integer numbers each xi, yi and wi (1 <= xi, yi <= n, 0 <= wi <= 2*10,000). xi and yi are two ends of a road and wi is the length of that road. | ||||||
Output | ||||||
For each case, output one line, contains a single integer number, the minimal length of Shapur's travel. | ||||||
Sample Input | ||||||
3 1 2 3 2 3 4 3 1 2 3 1 3 3 | ||||||
Sample Output | ||||||
7 9 |
主人公处于位子1,现在要走到其他各点至少一次,不必要回到原点,问最小花费。
思路:
1、不必要回到原点,我们不妨先将问题转化到需要回到原点上来,那么ans=走到其他各点至少一次并且回到原点的最小花费-从1出发的最长的一条链的花费(不能回头的那种);
2、那么设定sum【i】表示走完第i个点的所有子节点并且回到点i的最小花费。
那么有:sum【i】=2*w+sum【v】;
3、过程维护一条最长链,那么ans=sum【1】-maxn;
Ac代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
struct node
{
int from;
int to;
int next;
int w;
}e[5005000];
int head[100500];
int sum[100500];
int cont,maxn;
void add(int from,int to,int w)
{
e[cont].to=to;
e[cont].w=w;
e[cont].next=head[from];
head[from]=cont++;
}
void Dfs(int u,int from,int pathsum)
{
maxn=max(maxn,pathsum);
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].to;
int w=e[i].w;
if(v==from)continue;
Dfs(v,u,pathsum+w);
sum[u]+=sum[v]+2*w;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
cont=0;
maxn=0;
memset(sum,0,sizeof(sum));
memset(head,-1,sizeof(head));
for(int i=0;i<n-1;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
}
Dfs(1,-1,0);
printf("%d\n",sum[1]-maxn);
}
}
相关文章推荐
- hrbust 1750 Eternal Victory(树+广搜 类似找树的直径...)
- 选择陪审员 POJ1015 Jury Compromise 动态规划DP 搜索DFS 贪心
- Hrbust 1201 Zombie’s Treasure Chest【贪心+暴力枚举】
- HDOJ 5573 Binary Tree(qwb铜牌题 贪心+DFS)
- hrbust 1143 泉水(简单dfs)
- 【codeforces 731C 】【并查集+贪心 或者dfs搞连通分支 】【有n只袜子,k种颜色,在m天中,左右脚分别穿下标为l,r的袜子,问最少修改几只袜子颜色,可以使每天穿的袜子左右两只都同色】
- CF_292_D_ Drazil and Tiles_贪心、dfs
- Hrbust1648Tailmon与序列(贪心?)
- HDU - 5242 Game(dfs + 贪心)
- 【Codeforces Round 328 (Div 2)D】【树的直径 树的重心 贪心 两次dfs都找最小编号最远点】Super M 经过树上所有重要点的最小距离
- CS R22 C(dfs暴力),D(字符串循环节,模拟),E(贪心+线段树维护)
- poj 3900 dfs搜索剪枝+后缀和预处理+贪心
- uva 10123 No Tipping(DFS+几何力矩+贪心)
- HDU 5802 Windows 10 (贪心+dfs)
- hdu 5285 dfs染色+贪心(bc #48 B)
- HRBUST 1564 螺旋矩阵 DFS
- codeforces 680D D. Bear and Tower of Cubes(dfs+贪心)
- hrbust 1325 Leyni的车牌号【贪心】
- bzoj 1907: 树的路径覆盖 (贪心+dfs+树形dp)
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)