国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

51nod 1737 配對 【樹形dp】

2019-11-08 01:51:17
字體:
供稿:網(wǎng)友

題目:http://www.51nod.com/onlineJudge/questionCode.html#!PRoblemId=1737

題意:

給出一棵n個(gè)點(diǎn)的樹,將這n個(gè)點(diǎn)兩兩配對,求所有可行的方案中配對兩點(diǎn)間的距離的總和最大為多少。

分析:

貪心的想,為使距離總和最大,每條邊乘上的系數(shù)就要盡量的大, 設(shè)fx表示點(diǎn)x的兒子個(gè)數(shù),那每一條邊能乘上的最大的系數(shù),就是:min(n?fx,fx) 這種貪心的方法是否存在于一種構(gòu)造方法呢? 構(gòu)造:找出樹的重心,只要保證刪去重心后任意同一聯(lián)通塊中的兩點(diǎn)不構(gòu)成路徑即可,這樣每個(gè)連通塊中的點(diǎn)都向其他連通塊中的點(diǎn)連接,這樣構(gòu)造出來的配對方案滿足了每條邊都被統(tǒng)計(jì)min(s1,s2)次。 (找重心是為了每個(gè)連通塊不能超過n/2個(gè)點(diǎn),其實(shí)只要最大連通塊不超過n/2個(gè)點(diǎn),就能構(gòu)造出一種配對方案使得每條邊被統(tǒng)計(jì)min(s1,s2)次。) 時(shí)間復(fù)雜度O(n)

代碼:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;struct node { int v, w;};int n ;ll ans;vector <node> g[N];int dfs(int u, int pre) { int res = 1; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i].v, w = g[u][i].w; if (v == pre) continue; int sonnum = dfs(v, u); ans += (ll)min(sonnum, n - sonnum) * w; res += sonnum; } return res;}int main() { scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); g[u].push_back((node) {v, w}); g[v].push_back((node) {u, w}); } ans = 0; dfs(1, -1); printf("%I64d/n", ans); return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 随州市| 陈巴尔虎旗| 东辽县| 鹿邑县| 郴州市| 西城区| 阜阳市| 会泽县| 定兴县| 沁源县| 平泉县| 海城市| 津南区| 霍州市| 扶绥县| 淄博市| 治多县| 雅安市| 辽阳市| 云浮市| 霍林郭勒市| 永康市| 六盘水市| 响水县| 邛崃市| 专栏| 正蓝旗| 孟津县| 五指山市| 宁强县| 巴马| 酒泉市| 潮安县| 南平市| 永济市| 宿州市| 揭阳市| 姚安县| 新平| 阿勒泰市| 锡林郭勒盟|