栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1987 Distance Statistics

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1987 Distance Statistics

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;#define N 40005struct node {    int v, l;    node() {};    node(int _v, int _l): v(_v), l(_l) {};};vector<node> g[N];bool done[N], vis[N];int n, m, K, size, ans, root, s[N], f[N], d[N];vector<int> dep;void dfs(int now) {    int u;    vis[now] = true;    s[now] = 1;    for (int i=0; i<g[now].size(); i++) {        u = g[now][i].v;        if (!vis[u]) { dfs(u); s[now] += s[u];        }    }}void getroot(int now, int fa) {    int u;    f[now] = 0; s[now] = 1;    for (int i=0; i<g[now].size(); i++)        if ((u = g[now][i].v) != fa && !done[u]) { getroot(u, now); s[now] += s[u]; f[now] = max(f[now], s[u]);        }    f[now] = max(f[now], size-s[now]);    if (f[now] < f[root]) root = now;}void getdep(int now, int fa) {    dep.push_back(d[now]);    int u;    s[now] = 1;    for (int i=0; i<g[now].size(); i++)        if ((u = g[now][i].v) != fa && !done[u]) { d[u] = d[now] + g[now][i].l; getdep(u, now); s[now] += s[u];        }}int calc(int now, int init) {    d[now] = init; dep.clear();    getdep(now, 0);    sort(dep.begin(), dep.end());    int ret = 0;    for (int l=0, r=dep.size()-1; l<r; )        if (dep[l] + dep[r] <= K) ret += r-l++;        else r--;    return ret;}void work(int now) {    ans += calc(now, 0);    int u;    done[now] = true;    for (int i=0; i<g[now].size(); i++)        if (!done[u = g[now][i].v]) { ans -= calc(u, g[now][i].l); f[0] = size = s[u]; getroot(u, root=0); work(root);        }}int main() {    char ch;    int a, b, l;    scanf("%d%d", &n, &m);    for (int i=0; i<m; i++) {        scanf("%d%d%d %c", &a, &b, &l, &ch);        g[a].push_back(node(b, l));        g[b].push_back(node(a, l));    }    scanf("%d", &K);    memset(done, false, sizeof(done));    memset(vis, false, sizeof(vis));    for (int i=1; i<=n; i++) if (!vis[i]) dfs(i);    ans = 0;    for (int i=1; i<=n; i++) if (!done[i]) {        f[0] = size = s[i];        getroot(i, root=0);        work(root);    }    printf("%dn", ans);    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377608.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号