首页 > 其他分享 >P5536 【XR-3】核心城市

P5536 【XR-3】核心城市

时间:2022-12-07 22:45:37浏览次数:45  
标签:cnt P5536 fa int 核心 dep edge XR include

 

P5536 【XR-3】核心城市

考察:树的中心 思维  码力

/*
P5536 【XR-3】核心城市
1.核心城市肯定包含中心,其他城市到达重心的距离就是最小值
2.如果k>中个数,k<=1e5
3.可以dfs延伸,以中心为根节点算层数,把一层多少个点算出来,sum[i]表示第i层有几个点
4.如果一旦k < sigma(sum[t]),最远的深度mxdep - t即为答案
5.手造数据,模拟
6.发现问题,如果这一层未满,最深的减t,之后呢
7.建立一个大根堆,每次-1,知道减完k-sigma,取堆顶
8.算复杂度nlogn
9.建立样例,写代码:
13 5
1 2
1 3
1 4
1 5
2 6
3 7
4 8
4 9
5 10
6 11
8 12
12 13
ans:2
*/

/*
错误:树的形态可能是两条链特别长,这样并不是以中心点一圈一圈的去建立核心城市
而是选择 mxd[u] - d[u]最长的k个点删除,mxd[]表示u这个点对应的叶子节点深度,
剩余mxd[u] - d[u]中最长的那个点+1即为答案
后半句一开始没想到,想了很久T_T
*/

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
#define N 100005
using namespace std;
priority_queue<int> q;
int cnt, hd[N], rt, n, k, mx = 0x7fffffff, sum[N], g[N], x, y, d[N], mxd[N];
int dis[N];
struct Edge{
    int to, nxt;
}edge[N*2];
void add(int u, int v){
    cnt++;
    edge[cnt].to = v;
    edge[cnt].nxt = hd[u];
    hd[u] = cnt;
}
int pos1, pos2, mxdep = 0;
void dfs(int u, int fa, int dep){
    if(dep > mxdep){
        mxdep = dep; pos1 = u;
    }
    for(int i = hd[u]; i; i = edge[i].nxt){
        int v = edge[i].to;
        if(v == fa) continue;
        dfs(v, u, dep+1);
    }
}
void dfs1(int u, int fa, int dep){
    if(dep > mxdep){
        mxdep = dep; pos2 = u;
    }
    dis[u] = max(dis[u], dep);
    for(int i = hd[u]; i; i = edge[i].nxt){
        int v = edge[i].to;
        if(v == fa) continue;
        dfs1(v, u, dep+1);
    }
}

void work(int u, int fa, int dep){
    d[u] = mxd[u] = dep;
    // cout<<"d[u] "<<u<<" "<<d[u]<<endl;
    for(int i = hd[u]; i; i = edge[i].nxt){
        int v = edge[i].to;
        if(v == fa) continue;
        work(v, u, dep+1);
        mxd[u] = max(mxd[u], mxd[v]);
        // cout<<"ttt: "<<u<<" "<<mxd[v]<<endl;
    }
    // cout<<"q "<<u<<" "<<d[u]<<" "<<mxd[u]<<" "<<mxd[u]-d[u]<<endl;
    q.push(mxd[u] - d[u]);
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i = 1; i <= n-1; i++){
        scanf("%d%d",&x,&y);
        add(x, y); add(y,x);
    }
    dfs(1, 0, 0);
    memset(dis, 0, sizeof dis); mxdep = 0; dfs1(pos1, 0, 0);
    dfs1(pos2, 0, 0);
    mx = 0x7fffffff;
    for(int i = 1; i <= n; i++){
        if(mx > dis[i]){
            mx = dis[i]; rt = i;
        }
    }
    // cout<<"rt: "<<rt<<endl;

    work(rt, 0, 0);
    // for(int i = 1; i <= n; i++){
    //     cout<<i<<" "<<d[i]<<" "<<mxd[i]<<endl;
    // }
    // cout<<"hhh "<<q.top()<<endl;
    for(int i = 1; i <= k; i++) q.pop();
    printf("%d\n", q.top() + 1);
    return 0;
}

 


 

标签:cnt,P5536,fa,int,核心,dep,edge,XR,include
From: https://www.cnblogs.com/caterpillor/p/16964785.html

相关文章

  • 【Core Dump】核心转存 故障分析
    浏览关于coredump的文章时,下面两篇文章说的清晰易懂,转发下:https://blog.csdn.net/asdfghjkl0606/article/details/52841678https://blog.csdn.net/stpeace/article/detai......
  • 输入一个整数n<10 输入n+2行,如图的图形: 核心n行,周边被*号保卫
    n=input('');fori=1:n+1forj=1:n+2-ifprintf('');%输出左边的空格endfprintf('*');%输出左边的*号forj=1:2......
  • Xray自动化漏洞扫描
    安装chaitin/xray:一款完善的安全评估工具,支持常见web安全问题扫描和自定义poc|使用之前务必先阅读文档(github.com)下载之后双击exe就安装完成了配置编辑conf......
  • 手写vue-router核心原理
    最近也在观察vue3新特性,抽空玩一玩嵌套路由的vue-router,直接上代码项目目录结构代码展示app.vue<template><divid="app"><div><router-linkto="/"......
  • Webpack插件核心原理
    引言围绕Webpack打包流程中最核心的机制就是所谓的Plugin机制。所谓插件即是webpack生态中最关键的部分,它为社区用户提供了一种强有力的方式来直接触及webpack......
  • React核心工作原理
    ##1.1、虚拟DOM常见问题:reactvirtualdom是什么?说一下diff算法?拿到一个问题,一般回答都是是什么?为什么?怎么办?那就按照这个思路来吧!what用JavaScript对象表示DOM......
  • 如何使用JPA实现Spring 授权服务器的核心服务
    本指南展示了如何使用JPA实现Spring授权服务器​的核心服务。本指南的目的是提供自己实现这些服务的起点,以便您可以根据需要进行修改。定义数据模型创建JPA实体创建Spr......
  • [法律草案] 公开征求 – 无线电发射设备型号核心准代码编辑规则
    中国工业和信息化部发布了有关为经批准的无线电设备颁发的CMIITID的法规草案。该ID计划为12位数字,包含以下五项信息:年份代码、设备类别、地域代码、制造商代码和设备自主......
  • uni-app核心基础 uni-app属性绑定和事件绑定
    1属性绑定元素数据的绑定不能直接使用插值表达式,例如绑定元素的title属性、图片的src属性等,要使用v-bind进行属性绑定。元素添加属性使用v-bind绑定,简写成:使用图片要......
  • 前端核心分析
    概述Vue(读音/vju/,类似于view)是一套用于构建用户界面的渐进式框架,发布于2014年2月与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图......