日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ1741

發(fā)布時間:2025/3/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ1741 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

樹分治,每次把每個點的deep取出,排序。。。尺取法。。。

# include <stdio.h> # include <stdlib.h> # include <iostream> # include <algorithm> # include <string.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll;IL ll Read(){RG char c = getchar(); RG ll x = 0, z = 1;for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';return x * z; }const int MAXN(20010), INF(2147483647); int n, cnt, fst[MAXN], to[MAXN], nxt[MAXN], w[MAXN], k; int size[MAXN], rt, sz, mx[MAXN], vis[MAXN]; ll ans, d[MAXN];IL void Add(RG int u, RG int v, RG int f){ nxt[cnt] = fst[u]; to[cnt] = v; w[cnt] = f; fst[u] = cnt++; }IL void Getroot(RG int u, RG int fa){size[u] = 1; mx[u] = 0;for(RG int e = fst[u]; e != -1; e = nxt[e]){if(vis[to[e]] || to[e] == fa) continue;Getroot(to[e], u);size[u] += size[to[e]];mx[u] = max(mx[u], size[to[e]]);}mx[u] = max(mx[u], sz - size[u]);if(mx[u] < mx[rt]) rt = u; }IL void Getdeep(RG int u, RG int fa, RG ll dis){d[++cnt] = dis;for(RG int e = fst[u]; e != -1; e = nxt[e]){if(vis[to[e]] || to[e] == fa) continue;Getdeep(to[e], u, dis + w[e]);} }IL ll Calc(RG int u, RG int f){cnt = 0; Getdeep(u, 0, f);sort(d + 1, d + cnt + 1);RG ll ret = 0, l = 1, r = cnt;while(l < r) if(d[r] + d[l] <= k) ret += r - l, l++; else r--;return ret; }IL void Solve(RG int u){ans += Calc(u, 0); vis[u] = 1;for(RG int e = fst[u]; e != -1; e = nxt[e]){if(vis[to[e]]) continue;ans -= Calc(to[e], w[e]);rt = 0; sz = size[to[e]];Getroot(to[e], u);Solve(rt);} }int main(RG int argc, RG char* argv[]){n = Read(); k = Read(); mx[0] = INF;while(n && k){Fill(fst, -1); Fill(vis, 0); rt = ans = cnt = 0; sz = n;for(RG int i = 1, u, v, f; i < n; i++) u = Read(), v = Read(), f = Read(), Add(u, v, f), Add(v, u, f);Getroot(1, 0); Solve(rt);printf("%lld\n", ans);n = Read(); k = Read();}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/cjoieryl/p/8206385.html

總結(jié)

以上是生活随笔為你收集整理的POJ1741的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。