zoukankan      html  css  js  c++  java
  • Codeforces Round #635 (Div. 2) C.Linova and Kingdom

    代码内容讲得比较清晰,慢慢细品吧··

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<cstdlib>
    using namespace std;
    #define rep(i,l,r) for(i=l;i<=r;i++)
    #define ll long long
    const int INF = 0x7fffffff;
    const int N = 1e6 + 7;
    const int mod = 1e9 + 7;
    struct node {
        ll b;
        ll id;
    }h[N];
    ll c[N];
    vector<ll>G[N];
    bool cmp(const node& a, const node& b)
    {
        if (a.b == b.b)
            return G[a.id].size() < G[b.id].size();
        else
            return a.b > b.b;
    }
    ll n, m, t, x;
    ll vis[N];
    ll cnt[N];
    ll dis[N];
    int main()
    {
        ll i, j, k;
        ll u, v;
        cin >> n >> k;
        rep(i, 1, n - 1)
        {
            cin >> u >> v;
            G[u].push_back(v);
            G[v].push_back(u);
        }
        memset(vis, 0, sizeof(vis));
        x = 0;
        h[1].b = 0;
        rep(i, 1, n)
        {
            h[i].id = i;
            cnt[i] = 1;
        }
        vis[1] = 1;
        queue<ll>q;
        q.push(1);
        while (!q.empty())
        {
            ll start = q.front();
            q.pop();
            for (i = 0; i < G[start].size(); i++)
            {
                if (!vis[G[start][i]])
                {
                    vis[G[start][i]] = 1;
                    h[G[start][i]].b = h[start].b + 1;//计算深度
    
                    q.push(G[start][i]);
                }
            }
        }
        rep(i, 1, n)
        {
            dis[i] = h[i].b;
        }
        sort(h + 1, h + n + 1, cmp);
        for (i = 1; i <= n; i++)
        {
            int now = h[i].id;
            for (j = 0; j < G[now].size(); j++)
            {
                if (dis[G[now][j]] > dis[now])
                    cnt[now] += cnt[G[now][j]];
                //计算该节点的儿子们所做的贡献,即当该节点被标记时,统计该点后面儿子们所失去的总贡献
               // cout << cnt[now] << " " << cnt[G[now][j]]<<" ";
               
            }
           /* cout << endl;*/
            h[i].b -= (cnt[now] - 1);//若该点被标记,减去儿子后面的所做的贡献,记得-1减去本身
        }
        sort(h + 1, h + n + 1, cmp);
    
        ll ans = 0;
        rep(i, 1, k)
        {
            ans += h[i].b;
        }
        cout << ans << endl;
    
    }
    /*
    20 7
    9 7
    3 7
    15 9
    1 3
    11 9
    18 7
    17 18
    20 1
    4 11
    2 11
    12 18
    8 18
    13 2
    19 2
    10 9
    6 13
    5 8
    14 1
    16 13
    */
  • 相关阅读:
    Linux下MySql多实例免安装部署
    linux apf防火墙安装配置
    Fedora Yum命令查询软件包及清除缓存
    什么时候使用e.target.content和e.target as MovieClip
    帧频计数器
    设置播放器的品质
    访问文件名连续的mc、txt、btn
    Sound 音乐工具类【转载】
    确定字符串中、出现特定字符串的次数
    数组var _list:Array = new Array({logType:"1"});
  • 原文地址:https://www.cnblogs.com/ch-hui/p/12711057.html
Copyright © 2011-2022 走看看