Kisu Pari Na 2
题目描述:
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相关推荐
- UVA 12437 Kisu Pari Na 2
无向图经过K个顶点的最少花费,每条路的权值相等均为1 # include <stdio.h> # include <string.h> # include <algori ...
- R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图、使用subset函数、使用drop_na函数
R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图.使用subset函数.使用drop_na函数 目录
- R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值
R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值 目录 R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值
- 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 ...
- 解决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: ...
- ggplot2可视化水平箱图并使用fct_reorder排序数据、使用na.rm处理缺失值(reorder boxplot with fct_reorder)、按照箱图的中位数从小到大排序水平箱图
ggplot2可视化水平箱图并使用fct_reorder排序数据.使用na.rm处理缺失值(reorder boxplot with fct_reorder).按照箱图的中位数从小到大排序水平箱图(O ...
- pandas对dataframe进行排序:单数据列排序、多数据列排序、NA值排序位置、排序算法
pandas对dataframe进行排序:单数据列排序.多数据列排序.NA值排序位置.排序算法 目录 pandas对dataframe进行排序 #仿真数据 #基于单数据列进行dataframe排序
- R语言自定义函数计算dataframe每列中的缺失值NA的个数、缺失值问题及其填充示例
R语言自定义函数计算dataframe每列中的缺失值NA的个数.缺失值问题及其填充示例 目录
- R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量、将异常离散编码转化为NA值
R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量.将异常离散编码转化为NA值 目录
最新文章
- 物种丰度排序堆积柱形图及处理间各物种差异分析
- Youth---青春
- tomcat访问oracle卡死,tomcat无法连接到oracle
- 南京大学计算机科学与技术学费,南京大学计算机科学与技术系招生信息
- Override and Overload (重写和重载)
- 执行 link.exe 时出错_在20多岁时应该做什么,以避免在30多岁和40多岁时后悔?...
- 运行npm install命令后的执行过程
- 【分治】动态点分治 ([ZJOI2007]捉迷藏)
- 不同业务场景下如何进行数据库水平切分?
- php 设置多个html条件_PHP-FPM是个啥
- aGlass学习笔记 1
- linux 服务 优先级,设置Linux自启服务以及优先级
- 破解极验(geetest)滑动验证码
- 【Django】Django视图views详解
- 关于ABAQUS2020二次开发
- Wxpython pannel切换
- 设计模式——23种设计模式学习总结
- 用户下单时商品库存变化
- 机器人视觉系统的构成
- duxing201606很快乐