FZU 2195 检查站点(并查集或者树)

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;
}

你可能感兴趣的:(FZU)