FZU 检查站点

    Problem 2195 检查站点
Accept: 70 Submit: 176
Time Limit: 1000 mSec Memory Limit : 32768 KB
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

这是题目链接: 点点点

这道题现在想想真坑,一直想的是用深度搜索来做, 今天看了别人的题解,原来是如此的简单。。。。。思路:这道题说的是把所有的点遍历一遍,下山的时候不耗时,只有上山的时候耗费时间,而且最后不必回到起点,

以呢,我们可以找到上山耗时最多的那条路径,用作最后一步的下山,其他的都要经过山上和下山两个过程,

而且每一个点都只有一个父节点,该点为子节点的时候,只对应一个上山耗费时间。由此可得,该题只需要求出所有

的上山耗费时间之和再减去最长那条路径长度就可以解出来了,好像深度优先搜索也能做出来,这道题的数据太大,用二维数组开不了这么大的内存,据说要用到vector,改天再好好学学,马上就要省赛了,这几天啥也没学难过该好

好练练了,不能再瞎玩了,昨天真的很难受, 不过今天高兴多了,今天把a_jie妹妹他们送走

了,一路上聊得挺开心的,我得加把劲了,努力去给ta们幸福的生活,困了,贴代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int fa[100005];
int w[100005];
int get(int x)//求从x点上山耗费时间
{
	int ans=0;
	for(;x;x=fa[x]) 
	{
		ans+=w[x];
	}
	return ans;
}
int main()
{
	int n,i,u,v,p;
	while(scanf("%d",&n)!=EOF)
	{
		memset(fa,0,sizeof(fa));
		memset(w,0,sizeof(w));
		int sum=0;
		for(i=1;i<=n-1;i++)
		{
			scanf("%d%d%d",&u,&v,&p);
		    fa[v]=u;//表示v的父节点是v
		    w[v]=p;//以v为子节点的上山耗费时间为p
		    sum+=p;
		}
		int s=0;
		for(i=2;i<=n;i++)
		{
			s=max(s,get(i));//求最大的上山耗费时间
		}
		printf("%d\n",sum-s);
	}
	return 0;
} 

你可能感兴趣的:(FZU 检查站点)