加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

CF 61D Eternal Victory 图论小思维

(2011-10-08 16:29:06)
标签:

cf

61d

eternal

victory

图论小思维

it

分类: 图论

题目描述:

无向树,每条边有边权,你在1号点,要求沿着边走,每个点至少走1边的最小花费是多少。

解题报告:

容易发现,只有1~最后一个访问节点的那条路径的边仅仅访问一遍,其他的边均访问了两遍。

那么,求的从1到其他节点的距离,所有边权和的2-最大距离就是答案。

代码如下:

#include<iostream>

#include<cstring>

#include<vector>

#include<algorithm>

#include<cmath>

#include<cstdio>

using namespace std;

#define SIZE 100005

vector<pair<int, int> > g[SIZE];

int n, ans;

void dfs(int id, int fa, int sum)

{

    ans = max(ans, sum);

    for(int i = 0; i < g[id].size(); i++) if (g[id][i].first != fa)

        dfs(g[id][i].first, id, sum + g[id][i].second);

}

int main()

{

    scanf("%d", &n); long long sum = 0;

    for(int i = n - 2; i >= 0; i--)

    {

        int a, b, c;scanf("%d%d%d", &a, &b, &c);

        g[a].push_back(make_pair(b, c));

        g[b].push_back(make_pair(a, c));

        sum += c;

    }

    ans = 0;

    dfs(1, -1, 0);

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

         return 0;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有