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

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

POJ - 1987 樹分治

2019-11-11 07:48:53
字體:
供稿:網(wǎng)友

題意:

與POJ-1741一致,傳送門:點擊打開鏈接

思路:

沒什么意思,直接套模板

代碼:

#include <cstdio>#include <cstring>#include <iostream>#include <vector>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 1e5 + 10;struct node {    int v;    ll w;};ll k;int n, m, root, Max, ans;vector <node> tree[MAXN];vector <ll> dis;int sz[MAXN], maxv[MAXN];bool vis[MAXN];void init() {    memset(vis, false, sizeof(vis));    for (int i = 1; i <= n; i++) tree[i].clear();}void dfs_size(int u, int PRe) {         // 求出每個子樹的大小,以及每個節(jié)點的最大兒子    sz[u] = 1; maxv[u] = 0;    int cnt = tree[u].size();    for (int i = 0; i < cnt; i++) {        int v = tree[u][i].v;        if (v == pre || vis[v]) continue;        dfs_size(v, u);        sz[u] += sz[v];        maxv[u] = max(maxv[u], sz[v]);    }}void dfs_root(int r, int u, int pre) {  // 找出以u為根的子樹的重心    maxv[u] = max(maxv[u], sz[r] - sz[u]);    if (Max > maxv[u]) {        Max = maxv[u];        root = u;    }    int cnt = tree[u].size();    for (int i = 0; i < cnt; i++) {        int v = tree[u][i].v;        if (v == pre || vis[v]) continue;        dfs_root(r, v, u);    }}void dfs_dis(int u, int pre, int d) {    // 求出當前子樹中所有點到根的距離    dis.push_back(d);    int cnt = tree[u].size();    for (int i = 0; i < cnt; i++) {        int v = tree[u][i].v, w = tree[u][i].w;        if (v == pre || vis[v]) continue;        dfs_dis(v, u, d + w);    }}int cal(int u, int d) {         // 計算當前子樹中合法的點對數(shù)    int res = 0;    dis.clear(); dfs_dis(u, -1, d);    sort (dis.begin(), dis.end());    int i = 0, j = dis.size() - 1;    while (i < j) {        while (dis[i] + dis[j] > k && i < j) --j;        res += j - i;        ++i;    }    return res;}void dfs(int u) {               // 總的dfs求解    Max = n;    dfs_size(u, -1); dfs_root(u, u, -1);    ans += cal(root, 0);    vis[root] = true;    int cnt = tree[root].size(), rt = root; // 一定要注意這樣里的root是全局變量,在遞歸之后可能改變,需要提前保存下來。    for (int i = 0; i < cnt; i++) {        int v = tree[rt][i].v, w = tree[rt][i].w;        if (vis[v]) continue;        ans -= cal(v, w);        dfs(v);    }}int main() {    //freopen("in", "r", stdin);    while (scanf("%d%d", &n, &m) == 2) {        init();        char s[10];        for (int i = 1; i < n; i++) {            int u, v;            ll w;            scanf("%d%d%lld%s", &u, &v, &w, s);            tree[u].push_back((node){v, w});            tree[v].push_back((node){u, w});        }        scanf("%lld", &k);        ans = 0;        dfs(1);        printf("%d/n", ans);    }    return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巨野县| 紫阳县| 大同市| 尼木县| 新邵县| 密云县| 天长市| 九江县| 百色市| 吉安县| 崇信县| 彭山县| 崇义县| 沙坪坝区| 师宗县| 天津市| 井陉县| 乐业县| 临西县| 泊头市| 睢宁县| 左贡县| 武定县| 慈溪市| 温宿县| 綦江县| 隆安县| 黑水县| 东乌珠穆沁旗| 双柏县| 嘉黎县| 凤冈县| 马尔康县| 连州市| 汉中市| 郴州市| 淳安县| 石狮市| 广安市| 莱州市| 罗定市|