Problem Description
在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检查,各个站点间有且仅有一条通路,检查员下山前往站点时比较轻松,而上山时却需要额外的时间,问最后检查员检查完所有站点时所需要的额外时间最少是多少。
Input
包含多组数据 每组数据输入第一行为一个整数N 表示站点个数(1<=N<=100000),接下去N-1 行 每行3个整数 x,y,z(1<=z<=10000) 检查站x为检查站y的父节点,x,y之间有一条通路,从y到x需要额外z的时间。(父节点在子节点上方,山顶固定标号为1)
Output
输出一行一个整数表示最少需要花费的额外时间。
Sample Input
6
1 2 1
2 4 1
1 3 1
3 5 1
3 6 1
Sample Output
3
本题一看挺懵逼的,,后来仔细一想也不是太难。。。就是找到花费时间最多的那一条路不好想。。。坑人的题,。。还有本题用到了并查集的有关知识。。。没学过的读者要自学一下喽。。。。
下面附上AC代码,看完打码你就会明白喽,,,先看懂题目。。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int pre[100005],cost[100005];
int getmost(int i)//找到最长的那一条链
{
int costmost=0;
while(i)//学过并查集的都懂
{
costmost+=cost[i];
i=pre[i];
}
return costmost;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(pre,0,sizeof(pre));
memset(cost,0,sizeof(cost));
int a,b,c;
int sum=0;
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
pre[b]=a;
cost[b]=c;
sum+=c;
}
int most=0;
for(int i=1;i<=n;i++)//除了最长的那一条链直接滑下去其他的都要反着走
{
if(getmost(i)>most)
{
most=getmost(i);
}
}
printf("%d\n",sum-most);
}
return 0;
}