第四集,聚集城市

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. 详解 git 忽略文件 删除远端仓库的文件

    要解决的问题 忽略指定类型的文件 或 某个指定文件(夹) 将已经push到github的文件删除, 但本地的文件不删除 (写忽略规则之前就把这个文件夹push了 T_T ) 将想要忽略掉的文件的相关记 ...

  2. HTML第六章 盒子模型

    什么是盒子模型: (1)边框: (2)内边距: (3)外边距: (4)元素内容·: (5)背景色·: 边框: 属性: 颜色(border-color),粗细(border-width),样式(bord ...

  3. 【Java笔记】【Java核心技术卷1】chapter3 D4变量

    package chapter3; public class D4变量 { public static final int BBB=100; //类常量 public static void main ...

  4. C语言数组排序——冒泡排序、选择排序、插入排序

    一.冒泡排序 原理解析:(以从小到大排序为例)在一排数字中,将第一个与第二个比较大小,如果后面的数比前面的小,则交换他们的位置. 然后比较第二.第三个……直到比较第n-1个和第n个,此时,每一次比较都 ...

  5. 基于 WPF 模块化架构下的本地化设计实践

    背景描述 最近接到一个需求,就是要求我们的 WPF 客户端具备本地化功能,实现中英文多语言界面.刚开始接到这个需求,其实我内心是拒绝的的,但是没办法,需求是永无止境的.所以只能想办法解决这个问题. 首 ...

  6. 「雕爷学编程」Arduino动手做(9)——火焰传感器模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  7. Xcodebuild命令使用

    Xcodebuild简介 Xcodebuild是命令行工具包的其中一项. 命令行工具包(Command Line Tools)是一个轻量的.可以与XCode分开的.在Mac上单独下载的命令行工具包. ...

  8. 解决多字段联合逻辑校验问题【享学Spring MVC】

    每篇一句 不要像祥林嫂一样,天天抱怨着生活,日日思考着辞职.得罪点说一句:"沦落"到要跟这样的人共事工作,难道自己身上就没有原因? 前言 本以为洋洋洒洒的把Java/Spring数 ...

  9. Gradle——创建简单的项目

    项目 & 任务 Gradle 的一切都是基于项目和任务的. 构建由一个或多个项目组成.项目的概念很抽象,它取决于你要用Gradle 做什么 .项目可以是 一个 Jar 库或者一个 web 程序 ...

  10. idea(java)实用开发插件

    Idea常用的插件: mybatisX,      ----------------  (Alt + enter) codeGlace, Lombok, sonarlint, translation, ...