国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 安塞县| 金阳县| 墨竹工卡县| 中阳县| 都兰县| 大余县| 鲜城| 长武县| 晋中市| 定南县| 孝感市| 钦州市| 菏泽市| 鹿邑县| 鹤山市| 莱芜市| 伊宁市| 德兴市| 桦南县| 龙山县| 天镇县| 武陟县| 黄大仙区| 娄烦县| 乌海市| 沂源县| 通道| 商南县| 阿拉善左旗| 葫芦岛市| 深圳市| 龙川县| 阿巴嘎旗| 广平县| 尼木县| 松阳县| 江陵县| 名山县| 宣威市| 长武县| 化州市|