您的位置:首页 > 其它

FZU 2195 检查站点(数学啊)

2015-05-03 18:55 337 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=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

61 2 12 4 11 3 13 5 13 6 1



Sample Output

3



Source

福州大学第十二届程序设计竞赛

PS:

只需要用所有的额外时间的和减去其中某一条需要最大的子额外时间的链!

代码如下:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int father[100005];
int a[100005];
void visi(int a,int b)
{
    father[a]=b;
}

int depthsum(int x)
{
    int sum = 0;
    while(x)
    {
        sum+=a[x];
        x=father[x];
    }
    return sum;
}
int main()
{
    int n,x,y,z;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        int sum = 0;
        memset(father,0,sizeof(father));
        for(int i=0; i<n-1; i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            sum+=z;
            a[y] = z;
            visi(y,x);
        }
        int tans = depthsum(1);
        for(int i = 2; i <= n; i++)
        {
            if(depthsum(i) > tans )
            {
                tans = depthsum(i);
            }
        }
        printf("%d\n",sum-tans);

    }
    return 0;
}
/*
6
1 2 1
2 4 2
1 3 3
3 5 4
3 6 5
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: