zoukankan      html  css  js  c++  java
  • luogu5536 核心城市

    题目描述

    X 国有 nn 座城市,n − 1n1 条长度为 11 的道路,每条道路连接两座城市,且任意两座城市都能通过若干条道路相互到达,显然,城市和道路形成了一棵树。

    X 国国王决定将 kk 座城市钦定为 X 国的核心城市,这 kk 座城市需满足以下两个条件:

    1. 这 kk 座城市可以通过道路,在不经过其他城市的情况下两两相互到达。
    2. 定义某个非核心城市与这 kk 座核心城市的距离为,这座城市与 kk 座核心城市的距离的最小值。那么所有非核心城市中,与核心城市的距离最大的城市,其与核心城市的距离最小。你需要求出这个最小值。

    输入格式

    第一行 22 个正整数 n,kn,k。

    接下来 n - 1n1 行,每行 22 个正整数 u,vu,v,表示第 uu 座城市与第 vv 座城市之间有一条长度为 11 的道路。

    数据范围:

    • 1 le k < n le 10 ^ 51k<n105。
    • 1 le u,v le n, u e v1u,vn,u=v,保证城市与道路形成一棵树。

    输出格式

    一行一个整数,表示答案。

    输入输出样例

    输入 #1
    6 3
    1 2
    2 3
    2 4
    1 5
    5 6
    
    输出 #1
    1
    

    说明/提示

    【样例说明】

    钦定 1,2,51,2,5 这 33 座城市为核心城市,这样 3,4,63,4,6 另外 33 座非核心城市与核心城市的距离均为 11,因此答案为 11。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+10;
     4 struct edge
     5 {
     6     int u,v,nxt;
     7 }e[maxn<<1];
     8 int head[maxn],js;
     9 void addage(int u,int v)
    10 {
    11     e[++js].u=u;e[js].v=v;
    12     e[js].nxt=head[u];head[u]=js;
    13 }
    14 int n,m;
    15 int rd[maxn],dis[maxn];
    16 queue<int>q;
    17 int main()
    18 {
    19     scanf("%d%d",&n,&m);
    20     for(int u,v,i=1;i<n;++i)
    21     {
    22         scanf("%d%d",&u,&v);
    23         addage(u,v);
    24         addage(v,u);
    25         rd[u]++;rd[v]++;
    26     }
    27     for(int i=1;i<=n;++i)dis[i]=1e5+10;
    28     for(int i=1;i<=n;++i)
    29         if(rd[i]==1)
    30         {
    31             dis[i]=1;
    32             q.push(i);
    33         }
    34     int cnt=n;
    35     while(!q.empty())
    36     {
    37         int u=q.front();q.pop();
    38         cnt--;
    39         if(cnt==m)
    40         {
    41             printf("%d
    ",dis[u]);
    42             return 0;
    43         }
    44         for(int i=head[u];i;i=e[i].nxt)
    45         {
    46             int v=e[i].v;
    47             if(rd[v]>1)--rd[v];
    48             if(rd[v]==1&&dis[v]>dis[u]+1)
    49             {
    50                 dis[v]=dis[u]+1;
    51                 q.push(v);
    52             }
    53         }
    54     }
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    CodeForces 19D Points (线段树+set)
    FZU 2105 Digits Count
    HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
    HDU 5634 Rikka with Phi (线段树)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
  • 原文地址:https://www.cnblogs.com/gryzy/p/14584868.html
Copyright © 2011-2022 走看看