Eternal Victory

题目链接

题意:给出n个点,再给出n-1条路,想一口气从1走完n个点的最小距离。

思路:好像它不构成环!md没看清题目,所以说每次遍历完全部的点后,最短的路就是每条边的距离*2减去最长路的距离。

所以简单的dfs求最长路。

#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
struct point 
{
    int x;
    int y;
};
vector<point> v[100010];
int n;
int maxd;
void dfs(int x,int y,int d)
{
    if(d>maxd)
    maxd=d;
    for(int i=0;i<v[x].size();i++)
    {
        int nextt=v[x][i].x;
        if(nextt!=y)
        {
            dfs(nextt,x,d+v[x][i].y);
        }
    }
}
int main()
{
    scanf("%d",&n);
    ll sum=0;
    maxd=0;
    for(int i=1;i<=n-1;i++)
    {
        int a;
        point u;
        scanf("%d%d%d",&a,&u.x,&u.y);
        a--;
        u.x--;
        sum+=(ll)u.y;
        v[a].push_back(u);
        swap(a,u.x);
        v[a].push_back(u); 
    }
    sum*=2;
    dfs(0,-1,0);
    printf("%lld\n",sum-maxd);
}

 

posted @ 2019-08-13 09:38  Ldler  Views(178)  Comments(0Edit  收藏  举报