第四集,聚集城市

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. 【SVN】eclipse 安装 SVN 插件

    链接:eclipse中svn插件的安装 SVN 插件地址:http://subclipse.tigris.org/servlets/ProjectProcess;jsessionid=8EB28B11 ...

  2. Keil uVision4 ——如何新建一个项目

    一.打开Keil4软件,点击Project,再点击New μVision Projrct. 二.新建一个文件夹,并在里面输入这个项目的名字. 三.点击Intel,根据实际情况选择,这里选择的是80/8 ...

  3. JVM内存结构 VS Java内存模型 VS Java对象模型

    前面几篇文章中, 系统的学习了下JVM内存结构.Java内存模型.Java对象模型, 但是发现自己还是对这三者的概念和区别比较模糊, 傻傻分不清楚.所以就有了这篇文章, 本文主要是对这三个技术点再做一 ...

  4. dubbo文档笔记

    配置覆盖关系 以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似: 方法级优先,接口级次之,全局配置再次之. 如果级别一样,则消费 ...

  5. c#异常后重试操作

    private void TryConnect(System.Action action)         {             int retries = 3;             whi ...

  6. ajax定义与开发最简五步骤

    ajax是什么? a (async异步)  j (javascript)  a (and)  x (xml)即异步的javascript和xml ajax特点:异步 不刷新整个页面 (局部刷新) we ...

  7. spark学习(10)-RDD的介绍和常用算子

    RDD(弹性分布式数据集,里面并不存储真正要计算的数据,你对RDD的操作,他会在Driver端转换成Task,下发到Executor计算分散在多台集群上的数据) RDD是一个代理,你对代理进行操作,他 ...

  8. python3学习-logging模块

    1.logging模块的使用非常简单,引入模块就可以使用. import logging logging.debug('This is debug message') logging.info('Th ...

  9. Opengl_入门学习分享和记录_02_渲染管线(一)顶点输入

    现在前面的废话:最近好事不断!十分开心!生活真美好! 好了今天要梳理一下,顶点输入的具体过程,同样也是渲染管线中的第一个阶段的详细过程的介绍.之前介绍过,OpenGL操作的是一组3D坐标,所以我们的输 ...

  10. Sentry错误日志监控你会用了吗?

    无论作为新手还是老手程序员在程序的开发过程中,代码运行时难免会抛出异常,而且项目在部署到测试.生产环境后,我们便不可能像在开发时那样容易的及时发现处理错误了.一般我们都是在错误发生一段时间后,错误信息 ...