cqyz oj | 【训练题】铲雪车问题

Description

  大雪覆盖了整座城市,市政府要求“交通部门”尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通。整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的。清单给出了最少的街道,使得这些街道的积雪清除后任意两个交叉路口之间有且仅有一条通路。冬季交通部门只有一辆铲雪车和一名司机,这辆铲雪车的出发点位于某个交叉路口S。
  无论街道上有没有积雪,铲雪车每前进一米都要消耗一升燃料。交通部门要求司机在铲除清单上的所有街道的积雪的前提下,消耗燃料最少,铲完后车可以停在任意交叉路口。

Input

  第一行包含2个整数N,S(1<=S<=N),N 为交叉路口总数,路口的标号为1...N,S为铲雪车出发的路口序号。  接下来的N-1行为清单上的街道,每一行包含三个用空格隔开的整数A,B,C,表示一条从交叉路口A到交叉路口B的街道,C为该街道的长度(单位为米)。

Output

  仅一行,包含一个整数,表示铲掉所有积雪所需的最少燃料。

Sample Input 1

5 1
1 2 8
1 3 10
3 4 10
4 5 7

Sample Output 1

43

Hint

20%的数据有:1<=N<=15;
100%的数据有:1<=N<=100000,1<=C<=1000。


按题意,街道就是棵树,每条边都要走来回共2遍,除了...

可以选择最后不回到根,因此肯定找条离根最远的叶子节点为最后一个节点,然后就停在这里不回去了,达到距离走的最小。
除此之外其他的路都要走2遍,因此主要就是考求离根最远的节点的距离。是个水题,完毕。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 100005 
#define maxm 200005
using namespace std;
int fir[maxn],ne[maxm],to[maxm],w[maxm],np=0;
void add(int x,int y,int z){
    ne[++np]=fir[x];
    fir[x]=np;
    to[np]=y;
    w[np]=z;
}

int dfs(int u,int f){
    int ans=0;
    for(int i=fir[u];i;i=ne[i]){
        int v=to[i];
        if(v==f)continue;
        int tmp=dfs(v,u)+w[i];
        ans=max(ans,tmp);
    }
    return ans;
}
int main(){
    int n,s;
    scanf("%d%d",&n,&s);
    int sum=0;
    for(int i=1,x,y,z;i<n;i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);add(y,x,z);
        sum+=z;
    }
    printf("%d",sum*2-dfs(s,0));
    return 0;
}

转载于:https://www.cnblogs.com/de-compass/p/11239800.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值