前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >牛客练习赛27 C. 水图(dfs+思维)

牛客练习赛27 C. 水图(dfs+思维)

作者头像
Ch_Zaqdt
发布2019-01-10 16:56:13
3300
发布2019-01-10 16:56:13
举报
文章被收录于专栏:Zaqdt_ACM

题目链接:https://www.nowcoder.com/acm/contest/188/C

       看似是一道最小生成树的题,实际上是一道思维题+暴搜,我们可以想一下,因为从一个结点出发要遍历所有的结点,所以必然是每条路径都要走两次,而只有一条路径只用走一次,所以我们只需要找出最长的一条路径让他只走一次就好了,所以最后的结果就是所有边的权值之和的二倍减去最长的一条路径。


AC代码:

代码语言:javascript
复制
#include <bits/stdc++.h>
#define maxn 50005
#define ll long long
using namespace std;
struct Node{
    int to;
    ll w;
    int next;
}Edge[maxn << 1];
int head[maxn << 1];
int n,s,num;
ll maxx;

void init(){
    memset(head,-1,sizeof(head));
    num = 0;
}

void add(int u,int v,ll w){
    Edge[num].to = v;
    Edge[num].w = w;
    Edge[num].next = head[u];
    head[u] = num++;
}

void dfs(int x,int xx,ll step){
    maxx = max(maxx, step);
    for(int i=head[x];i!=-1;i=Edge[i].next){
        if(Edge[i].to == xx)continue;
        dfs(Edge[i].to, x, step + Edge[i].w);
    }
}

int main()
{
    init();
    scanf("%d%d",&n,&s);
    ll sum = 0;
    for(int i=1;i<n;i++){
        int u,v;
        ll w;
        scanf("%d%d%lld",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
        sum += w;
    }
    maxx = 0;
    dfs(s, 0, 0);
    cout<<sum * 2 - maxx<<endl;
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年09月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档