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