zoukankan      html  css  js  c++  java
  • luoguP1395 会议

    分成两部

    1. 求出树的重心
    2. (BFS) 求出所有点到重心的距离
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 5e4 + 10;
    int e[N*2],ne[N*2],h[N],idx,rt,mds[N],ds[N],n,sum,d[N];
    void add(int a,int b) {
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx ++;
    }
    void dfs(int u,int fa) {
        ds[u] = 1;
        mds[u] = 0;
        for(int i = h[u];~i ;i = ne[i]) {
            int j = e[i];
            if(j == fa) continue;
            dfs(j,u);
            ds[u] += ds[j];
            mds[u] = max(mds[u],ds[j]);
        }
        mds[u] = max(mds[u],n - ds[u]);
        if(rt == 0 || mds[u] < mds[rt]) rt = u;
        if(mds[u] == mds[rt] && u < rt) rt = u;
    }
    void bfs() {
        queue<int> q;
        q.push(rt);
        while(q.size()) {
            int t = q.front();
            q.pop();
            for(int i = h[t]; ~i;i = ne[i]) {
                int j = e[i];
                if(d[j] || rt == j) continue;
                d[j] = d[t] + 1;
                sum += d[j];
                q.push(j);
            }
        }
    }
    int main() {
        memset(h,-1,sizeof h);
        cin >> n;
        for(int i = 0;i < n - 1; ++i) {
            int a,b;
            cin >> a >> b;
            add(a,b);
            add(b,a);
        }
        dfs(1,0);
        bfs();
        cout << rt << ' ' << sum << endl;
        return 0;
    }
    
  • 相关阅读:
    广度优先搜索(一)
    快速幂
    office 2013
    最著名的十大公式
    二分查找的上下界
    双关键字快速排序
    字符串操作
    分治算法练习(二)
    P3119 [USACO15JAN]草鉴定[SCC缩点+SPFA]
    P3225 [HNOI2012]矿场搭建[割点]
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/13171929.html
Copyright © 2011-2022 走看看