小A与欧拉路

小A与欧拉路

https://ac.nowcoder.com/acm/problem/22618

小A与欧拉路

分析

  • 欧拉路:

    该路径经过图的每一条边且仅经过一次。如果路径起点和终点相同,则称“欧拉回路”。具有欧拉回路的图称“欧拉图”。


  • 图片说明
    因为要求最短,那么path(x,y)最长即可。就是一个树的直径的模板

代码

/*树的直径*/
#include<bits/stdc++.h>

#define R register
#define ll long long
#define inf INT_MAX

using namespace std;

const int N=2e5+10;

int n,tot,ans,sum;
int h[N],nex[N<<1],ver[N<<1],pri[N];
int dis[N],f[N],g[N];

inline void add(int x,int y,int z)
{
    nex[tot]=h[x];
    ver[tot]=y;
    pri[tot]=z;
    h[x]=tot++;
}

inline void dfs(int u,int v)
{
    f[u]=g[u]=0;
    for (int i=h[u];~i;i=nex[i])
    {
        int j=ver[i];
        if(j==v) continue;

        dfs(j,u);

        if(f[j]+pri[i]>f[u])
        {
            g[u]=f[u];
            f[u]=f[j]+pri[i];
        }
        else g[u]=max(g[u],f[j]+pri[i]);
    }
    ans=max(ans,f[u]+g[u]);
}

int main()
{
    memset(h,-1,sizeof(h));
    scanf("%d",&n);
    for (int i=1;i<n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z),add(y,x,z);sum+=z;
    }

    dfs(1,0);

    printf("%lld\n",2ll*sum-(ll)ans);

    return 0;
}
每日一题 文章被收录于专栏

每天的题,为了牛币

全部评论

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
我是小红是我:学校换成中南
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务