新浪博客

CF 61D Eternal Victory 图论小思维

2011-10-08 16:29阅读:
题目描述:
无向树,每条边有边权,你在1号点,要求沿着边走,每个点至少走1边的最小花费是多少。
解题报告:
容易发现,只有1~最后一个访问节点的那条路径的边仅仅访问一遍,其他的边均访问了两遍。
那么,求的从1到其他节点的距离,所有边权和的2-最大距离就是答案。
代码如下:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cst
dio>
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', sum * 2 - ans);
return 0;
}

我的更多文章

下载客户端阅读体验更佳

APP专享