题目描述:

N, M (1 ≤ N ≤ 10000, 0 ≤ M < N).n个点,m条边.给出一个森林,q (1 ≤ q ≤ 10000)次查询,每次给出一个数x.问:一个人顺便走,一共走过x个不同的(包括起点)点所花费的最少的路径长度.树上的边是无向的,权值为1的.

题解:

不联通的树肯定不用放在一起考虑.看一棵树中,怎么走才能够走最近的路.不是简单路径,用树形dp的话可以描述,但是空间和时间都开不下.现在想直径的性质.我们把直径这条链拉出来,如果直径已经够了,就够了x-1的花费.直径不够的话,肯定往两边走,每多一个就是2的代价.这样贪心的走.
这样我们的解法是:一棵树有直径的长度k,和点的个数num.按照num排序,先保证能走x个点.再用树状数快速得到满足num的要求的点中最大的k的值,然后算一下就好了.

重点:

代码:

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int n, m, Q, x, y, maxd[10010], tot;
int vis[10010], deep[10010];
struct node {int num, d;node (int _num = 0, int _d = 0) {num = _num;d = _d;}friend bool operator < (node x, node y) {return x.num < y.num;}
}p[10010];
vector <int> gra[10010];
queue<int> q;
using namespace std;
int main() {int T;scanf("%d", &T);for (int cas = 1; cas <= T; ++cas) {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i) {gra[i].clear();}for (int i = 0; i < m; ++i) {scanf("%d%d", &x, &y);gra[x].push_back(y);gra[y].push_back(x);}memset(vis, 0, sizeof vis);memset(deep, 0, sizeof deep);tot = 0;for (int start = 1; start <= n; ++start) {if (vis[start]) {continue;}q.push(start);vis[start] = 1;while (!q.empty()) {x = q.front();q.pop();for (int i = 0; i < gra[x].size(); ++i) {if (!vis[gra[x][i]]) {vis[gra[x][i]] = 1;q.push(gra[x][i]);}}}vis[x] = 2;q.push(x);p[tot].num = 0;deep[x] = 0;while (!q.empty()) {x = q.front();q.pop();p[tot].num++;for (int i = 0; i < gra[x].size(); ++i) {if (vis[gra[x][i]] < 2) {vis[gra[x][i]] = 2;deep[gra[x][i]] = deep[x] + 1;q.push(gra[x][i]);}}}p[tot].d = deep[x];tot++;}sort(p, p + tot);maxd[tot] = 0;for (int i = tot - 1; i >= 0; --i) {maxd[i] = p[i].d;maxd[i] = max(maxd[i], maxd[i + 1]);}scanf("%d", &Q);printf("Case %d:\n", cas);while (Q--) {scanf("%d", &x);int pos = lower_bound(p, p + tot, node(x, 0)) - p;if (pos == tot) {printf("impossible\n");}else {if (maxd[pos] >= x - 1) {printf("%d\n", x - 1);}else {printf("%d\n", (x - maxd[pos] - 1) * 2 + maxd[pos]);}}}}return 0;
}

Kisu Pari Na 2相关推荐

  1. UVA 12437 Kisu Pari Na 2

    无向图经过K个顶点的最少花费,每条路的权值相等均为1 # include <stdio.h> # include <string.h> # include <algori ...

  2. R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图、使用subset函数、使用drop_na函数

    R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图.使用subset函数.使用drop_na函数 目录

  3. R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值

    R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值 目录 R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值

  4. Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : ‘x‘ must be atomic

    Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) :    'x' must be atomic 目录 Err ...

  5. 解决pandas:ValueError: Cannot convert non-finite values (NA or inf) to integer

    解决pandas:ValueError: Cannot convert non-finite values (NA or inf) to integer 目录 解决pandas:ValueError: ...

  6. ggplot2可视化水平箱图并使用fct_reorder排序数据、使用na.rm处理缺失值(reorder boxplot with fct_reorder)、按照箱图的中位数从小到大排序水平箱图

    ggplot2可视化水平箱图并使用fct_reorder排序数据.使用na.rm处理缺失值(reorder boxplot with fct_reorder).按照箱图的中位数从小到大排序水平箱图(O ...

  7. pandas对dataframe进行排序:单数据列排序、多数据列排序、NA值排序位置、排序算法

    pandas对dataframe进行排序:单数据列排序.多数据列排序.NA值排序位置.排序算法 目录 pandas对dataframe进行排序 #仿真数据 #基于单数据列进行dataframe排序

  8. R语言自定义函数计算dataframe每列中的缺失值NA的个数、缺失值问题及其填充示例

    R语言自定义函数计算dataframe每列中的缺失值NA的个数.缺失值问题及其填充示例 目录

  9. R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量、将异常离散编码转化为NA值

    R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量.将异常离散编码转化为NA值 目录

最新文章

  1. 物种丰度排序堆积柱形图及处理间各物种差异分析
  2. Youth---青春
  3. tomcat访问oracle卡死,tomcat无法连接到oracle
  4. 南京大学计算机科学与技术学费,南京大学计算机科学与技术系招生信息
  5. Override and Overload (重写和重载)
  6. 执行 link.exe 时出错_在20多岁时应该做什么,以避免在30多岁和40多岁时后悔?...
  7. 运行npm install命令后的执行过程
  8. 【分治】动态点分治 ([ZJOI2007]捉迷藏)
  9. 不同业务场景下如何进行数据库水平切分?
  10. php 设置多个html条件_PHP-FPM是个啥
  11. aGlass学习笔记 1
  12. linux 服务 优先级,设置Linux自启服务以及优先级
  13. 破解极验(geetest)滑动验证码
  14. 【Django】Django视图views详解
  15. 关于ABAQUS2020二次开发
  16. Wxpython pannel切换
  17. 设计模式——23种设计模式学习总结
  18. 用户下单时商品库存变化
  19. 机器人视觉系统的构成
  20. duxing201606很快乐

热门文章

  1. 通信及IT行业薪资参考表
  2. Python 大神强力推荐的11个Python 开发框架
  3. 火狐浏览器与驱动对应版本,自动化测试浏览器驱动下载
  4. FFmpeg解码的全能播放器
  5. 建立一个时间服务器要求客户端每天早上九点自动同步服务端时间
  6. java 特殊字符_Java正则表达式特殊字符及其处理以及正则表达式详解
  7. crowd(crowdfunding)
  8. 三维动画在计算机上的应用,计算机三维动画在工程设计的应用
  9. 智慧税务解决方案-最新全套文件
  10. Live2D的基础使用