牛客練習賽27【C 水圖 dfs求最長路】
連結:https://www.nowcoder.com/acm/contest/188/C
來源:牛客網
題目描述
小w不會離散數學,所以她van的圖論遊戲是送分的
小w有一張n個點n-1條邊的無向聯通圖,每個點編號為1~n,每條邊都有一個長度
小w現在在點x上
她想知道從點x出發經過每個點至少一次,最少需要走多少路
輸入描述:
第一行兩個整數 n,x,代表點數,和小w所處的位置 第二到第n行,每行三個整數 u,v,w,表示u和v之間有一條長為w的道路
輸出描述:
一個數表示答案
示例1
輸入
3 1 1 2 1 2 3 1
輸出
2
備註:
1 ≤ n ≤ 50000 , 1 ≤ w ≤ 2147483647
題解:發現從 x 出發,只有一條路徑可以只經過一次,其他的都會經過兩次 。找出這條最長的路徑,用所有路徑權值之和*2,減去這條路徑的就好了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define ll long long
#define INF 0x3f
using namespace std;
const int maxn = 50000+7;
int head[maxn], ver[maxn<<1];
ll edge[maxn<<1];
int Next[maxn];
int vis[maxn];
ll maxx;
int n, x;
int tot = 0;
ll ans = 0, sum = 0;
void add(int x, int y, ll z) {
ver[++tot] = y, edge[tot] = z;
Next[tot] = head[x];
head[x] = tot;
}
void dfs(int x, int fa, ll step){
maxx = max(step, maxx);
for(int i = head[x]; i; i = Next[i]){
if(ver[i] == fa) continue;
dfs(ver[i], x, step+edge[i]);
}
}
int main()
{
int u, v;
ll w;
scanf("%d %d", &n, &x);
for(int i = 0; i < n-1; i++){
scanf("%d %d %lld", &u, &v, &w);
add(u, v, w);
add(v, u, w);
ans += w;
}
dfs(x, 0, 0);
printf("%lld\n", ans*2 - maxx);
return 0;
}
/*
4 3
1 2 1
1 3 1
3 4 1
*/
相關文章
- 牛客練習賽
- 牛客練習賽 26
- 牛客練習賽60
- 牛客練習賽 71 AC
- 牛客練習賽26 A 平面【遞推】
- 牛客練習賽129 A-數數
- 牛客練習賽26 C 城市規劃【思維+貪心】
- 牛客周賽 Round 36 (小白練習記)
- 牛客練習賽73 D題:離別
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70
- Mysql 練習(牛客網)MySql
- 牛客練習賽40 B 小A與任務(貪心)
- 牛客小白月賽27部分題解
- 牛客題霸--求路徑
- 牛客小白月賽95 (賽前的練習之我是小菜雞)
- 牛客練習賽14B 區間的連續段
- 牛客小白月賽99 C~E
- 牛客題霸 [最長公共子串]C++題解/答案C++
- 牛客SQL練習第21題SQL
- 牛客小白月賽103 A--B--C
- 水題 求眾數 (hash的練習)
- 牛客練習賽 37 C 筱瑪的迷陣探險 【折半搜尋+01字典樹】
- 牛客練習賽74 E CCA的期望(算概率的技巧+floyd處理)
- 牛客周賽48
- 牛客小白月賽15 C 表單 ( map 使用)
- matlab練習程式(高斯牛頓法最優化)Matlab優化
- 牛客網 Coincidence(最長公共子串LCS板題)IDE
- 牛客小白周賽9
- 牛客周賽 Round 40
- 牛客小白月賽89
- 牛客小白月賽88
- 牛客周賽 Round 38
- 牛客周賽 Round 57
- 牛客周賽 Round 56
- 牛客小白月賽105
- 牛客周賽 Round 47
- 牛客周賽Ronud 46