来源:互联网 发布:看剧软件图标 编辑:程序博客网 时间:2024/04/28 16:07

这里写图片描述
有N个点,有N-1条双向边,很明显是一棵树,从根节点到字节点k再回到根节点必然要走两倍的路程,
但是当这个人走完N个节点后,就可以不用回到根节点了,我们很自然的想到我们可以让最长的去到子节点的一条路走一次,那么总的路程便是最短的。
用dfs+dp来跑最长的距离

#include <cstdio>#include <iostream>#include <cstring>using namespace std; int cnt,head[50001],net[100001],to[100001],cost[100001];int dis[50001]; int ans;int n;void add(int x,int y,int c){    cost[++cnt]=c;    to[cnt]=y;    net[cnt]=head[x];    head[x]=cnt;}void dfs(int x,int fat){    for(int i=head[x];i;i=net[i])    {        int p=to[i];        if(p==fat)continue;        dfs(p,x);        dis[x]=max(dis[x],dis[p]+cost[i]);    }}int main(){    scanf("%d",&n);    for(int i=1;i<n;i++)     {         int x,y,c;         scanf("%d%d%d",&x,&y,&c);         ans+=c;         add(x,y,c);         add(y,x,c);     }    dfs(1,-1);    printf("%d",ans*2-dis[1]);    return 0;} 
原创粉丝点击