第四集,聚集城市

TimeLimit:1000MS  MemoryLimit:128MB
64-bit integer IO format:%lld
 
Problem Description

在小A解读完手机信息后,得到了特工们的位置情报以及他们最近将会又一次聚会(除了谈论了关于抓捕小A和小C的事情外,主要谈论了关于走私事情…)

因为小C原本是他们的内部人员,所以她知道这个组织有一个习惯,即特工们每次选择聚会的城市,他们都会选择使所有组员所在市距离聚会城市的路程的和最小的城市,而且每个城市最多有一名特工

现在,小A知道了特工们的所在位置,小A根据城市地图绘制了一副简易图,图的如下信息:

1,有一副n个节点的双向无环图,每个节点表示一个城市。

2,每条边默认距离为1

3,有m个城市里住了他们的组员。

根据这些信息,得出一个城市编号X1<=X<=n),使X到这m个城市的距离的和最小。

小A知道这是他反击的机会,他需要证据,他不想在和小C一直过着颠簸流离的逃亡生活。他需要获取更多关于走私的信息,他才有足够多的证据端了这个组织.因此,他必须找到这个聚会城市、

Input

有多组测试案例

第一行输入两个正整数n和m。(2<n<=10000,1<m<=n)

第二行接下来输入m个正整数mi,表示城市mi有1名特工(mi!=mj,i!=j)、

接下来有n-1行,每一行输入两个正整数a和b,表示城市a和城市b相连、

Output

对于每组测试案例,输出符合的城市编号,如果有多个城市符合要求,则输出编号最小的那个城市、

SampleInput
8 4
4 3 6 7
4 7
5 6
1 8
1 3
7 5
5 2
5 3
SampleOutput
5

思路:先以1或任意节点为根节点深度优先搜索计算出根结点到所有需要到达点的距离,并且用数组cot[]记录各个点为根节点的子树有多少个含有所需要到达点的数量。

再次进行深搜更新dp[]    状态转移方程dp[to]=dp[now]+m-2*cot[to]

最后遍历一遍数组dp[]寻找最大值出现的位置即可

 #include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = +;
vector<int>e[maxn];
int has[maxn],vis[maxn],minLen[maxn],cot[maxn],dp[maxn],n,m,num;
//has:记录哪几个城市需要到达
//vis:记录是否有搜索过
//minLen:记录1到所有需要到达城市的最小距离
//cot:记录儿子有多少个需要到达的城市 //初始化
void init()
{
memset(vis,,sizeof(vis));
memset(has,,sizeof(has));
memset(cot,,sizeof(cot));
memset(minLen,,sizeof(minLen));
memset(dp,,sizeof(dp));
for(int i= ; i<=n; i++)
e[i].clear();
} //计算最短长度和每个点儿子有多少个需要到达的城市
int dfs1(int now,int dep)
{
int temp=;
if(has[now])
temp=;
minLen[now]=dep;
int len=e[now].size();
for(int i=; i<len; i++)
{
int to =e[now][i];
if(!vis[to])
{
vis[to]=;
temp=temp+dfs1(to,dep+);
}
}
cot[now]=temp;
return temp;
} void dfs2(int now)
{
int len=e[now].size();
for(int i=; i<len; i++)
{
int to = e[now][i];
if(!vis[to])
{
vis[to]=;
dp[to]=dp[now]+m-*cot[to];//状态转移方程
//dp[to] = dp[now] + m-cot[to](离父节点的所有城市+1) -cot[to](离子节点的所有城市-1);
dfs2(to);
}
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i = ; i<m; i++)
{
scanf("%d",&num);
has[num]=;
}
for(int i = ; i <n-; i++)
{
int x,y;
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
vis[]=;
dfs1(,);
for(int i=; i<=n; i++)
{
if(has[i])
dp[]+=minLen[i];
}
memset(vis,,sizeof(vis));
vis[]=;
dfs2();
int Min_dp=dp[],lie=;
for(int i=; i<=n; i++)
if(dp[i]<Min_dp)
{
Min_dp=dp[i];
lie=i;
}
printf("%d\n",lie);
}
return ;
}

树形动态规划 fjutoj-2131 第四集,聚集城市的更多相关文章

  1. 蓝桥杯 ALGO-4 结点选择 (树形动态规划)

    问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多少? 输入格式 第一行包含一个整数 n . 接下来的 ...

  2. 树形动态规划(树状DP)小结

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  3. 爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)

    处理代码 file = "a.srt" fi = open(file, mode='r') a = fi.readline() i = 1 while len(str(a)) != ...

  4. SpringBoot第四集:静态资源与首页定(2020最新最易懂)

    SpringBoot第四集:静态资源与首页定(2020最新最易懂) 问题 SpringBoot构建的项目结构如下:没有webapp目录,没有WEB-INF等目录,那么如果开发web项目,项目资源放在那 ...

  5. SpringBoot第四集:整合JdbcTemplate和JPA(2020最新最易懂)

    SpringBoot第四集:整合JdbcTemplate和JPA(2020最新最易懂) 当前环境说明: Windows10_64 Maven3.x JDK1.8 MySQL5.6 SpringTool ...

  6. 【ACM/ICPC2013】树形动态规划专题

    前言:按照计划,昨天应该是完成树形DP7题和二分图.最大流基础专题,但是由于我智商实在拙计,一直在理解树形DP的思想,所以第二个专题只能顺延到今天了.但是昨天把树形DP弄了个5成懂我是很高兴的!下面我 ...

  7. 树形动态规划(树形DP)入门问题—初探 & 训练

    树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...

  8. Orleans学习总结(四)--集群配置篇

    上篇我们讲了Orleans学习总结(三)--持久化篇,这一篇我们来说说集群配置,毕竟这个才是Orleans的看家本领 Orleans支持热起动,支持自动节点发现,能够断线重发等一系列黑科技. 我这篇是 ...

  9. 动态规划面试题基础合集1--数学三角形,LIS , LCS, CSD

    动态规划的一般思路是分为四步,即:寻找最优子结构.递归定义最优子结构.自底向上求解最优子结构和构造最优解. 接下来我列举出几个常见的动态规划面试题进行说明. (1)数学三角形:比较简单,直接贴一个我看 ...

随机推荐

  1. css3系列之详解perspective

    perspective 简单来说,就是设置这个属性后,那么,就可以模拟出像我们人看电脑上的显示的元素一样.比如说, perspective:800px   意思就是,我在离屏幕800px 的地方观看这 ...

  2. coffeescript 函数 箭头表达式

    函数 do可以形成闭包,使方法作用域不受外部变化的影响. 隐式返回最后一个表达式的值 函数调用省略括号 用arguments数组访问传递给函数的所有对象(低可读性) @name为this.name的简 ...

  3. H3C模拟器单臂路由配置实例

    单臂路由:用802.1Q和子接口实现VLAN间路由 单臂路由利用trunk链路允许多个VLAN的数据帧通过而实现 网络拓扑图: RTA配置: SW1配置: PC1/2配置如图: 但是值得注意的是,在配 ...

  4. Java性能权威指南读书笔记--之二

    新生代填满时,垃圾收集器会暂停所有的应用线程,回收新生代空间.这种操作被称为Minor GC. 老年代被填满时,垃圾收集器会暂停所有应用线程,对其进行回收,接着对堆空间进行整理.这个过程被称为Full ...

  5. codeforces1088D_Ehab and another another xor problem交互题

    传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...

  6. caddy & grpc(3) 为 caddy 添加一个 反向代理插件

    caddy-grpc 为 caddy 添加一个 反向代理插件 项目地址:https://github.com/yhyddr/caddy-grpc 前言 上一次我们学习了如何在 Caddy 中扩展自己想 ...

  7. JavaScript循环出现的问题——用闭包来解决

    在for循环中,数组长度为3,我本来是想对每个循环的元素绑定一个点击事件的,结果点击后控制台输出全部为1. for (var i = 0; i < data.data.length; i++) ...

  8. Flink 源码解析 —— JobManager 处理 SubmitJob 的过程

    JobManager 处理 SubmitJob https://t.zsxq.com/3JQJMzZ 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1 ...

  9. 在canvas中使用其他HTML元素

    做一个功能如下图,随机生成100个大小.颜色随机的小球.点击开始运动的时候,小球开始运动,然后点击停止运动的时候,小球停止运动. 点击旁边的白色或者黑色,则背景颜色变为相应的颜色. HTML部分: & ...

  10. BFS-迷宫问题

    问题描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...