樹的遍歷 (走完樹上所有點所需最小路程)


鏈接:https://www.nowcoder.com/acm/contest/188/C
來源:牛客網

小w不會離散數學,所以她van的圖論游戲是送分的
小w有一張n個點n-1條邊的無向聯通圖,每個點編號為1~n,每條邊都有一個長度
小w現在在點x上
她想知道從點x出發經過每個點至少一次,最少需要走多少路

輸入描述:

第一行兩個整數 n,x,代表點數,和小w所處的位置
第二到第n行,每行三個整數 u,v,w,表示u和v之間有一條長為w的道路

輸出描述:

一個數表示答案

(我居然連這種題都不會了啊,太笨了!!! 加油啊.....(miss mt) )

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const  int N=50007;
struct node
{
    int  nxt;
    LL   len;
};
vector < vector <node> > g(N);
LL dis[N];
int n,x; LL mmax;
void dfs (int rt,int fa) {
    for (int i=0;i<g[rt].size();i++) {
        int nxt=g[rt][i].nxt;
        int len=g[rt][i].len;
        if (nxt!=fa) {
            dis[nxt]=dis[rt]+len;
            mmax=max (mmax,dis[nxt]);
            dfs (nxt,rt);
        }
    }
    return ;
} 
int main ()
{
    scanf ("%d %d",&n,&x);
    LL ans=0; dis[x]=0;
    for (int i=1;i<n;i++) {
        int u,v; LL w;
        scanf ("%d %d %lld",&u,&v,&w);
        node tmp={v,w}; g[u].push_back(tmp);
        tmp.nxt=u;      g[v].push_back(tmp);
        ans+=w;
    }
    dfs (x,0);
    printf("%lld\n",ans*2-mmax);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM