CF#135 D. Choosing Capital for Treeland 树形DP
D. Choosing Capital for Treeland
题意
给出一颗有方向的n个节点的树,现在要选择一个点作为首都。
问最少需要翻转多少条边,使得首都可以到所有其他的城市去,以及相应的首都可以是哪些点。
思路
先忽略掉树中的方向,dp[i]
表示i节点到它的子树所有点最少需要翻转的边。
进行第一遍dfs
如果u-v的方向是u-->v,那么dp[u]=dp[u]+dp[v];
,否则dp[u]=dp[u]+dp[v]+1;
,表示u-v这条边要翻转。
这时根节点的dp值就是根节点作为首都需要翻转的边,进行第二遍dfs:
dp[i]
表示i作为首都需要翻转的最少边的数量
如果u-v的方向是u-->v,那么dp[v]=dp[u]+1;
,否则dp[v]=dp[u]-1
。
代码
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
vector<int>vec[N],ans;
int n,dp[N];
map<int,map<int,int> >mp;
void dfs(int u,int fa)
{
for(int v:vec[u])
{
if(v==fa) continue;
dfs(v,u);
dp[u]+=(dp[v]+!mp[u][v]);
}
}
void dfs2(int u,int fa)
{
for(int v:vec[u])
{
if(v==fa) continue;
if(mp[u][v]) dp[v]=dp[u]+1;
else dp[v]=dp[u]-1;
dfs2(v,u);
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<n; i++)
{
int u,v;
scanf("%d%d",&u,&v);
mp[u][v]=1;//mp[u][v]==1,表示u-v的方向是u-->v
vec[u].pb(v);
vec[v].pb(u);
}
dfs(1,0);
dfs2(1,0);
int maxn=inf;
for(int i=1; i<=n; i++)
{
if(dp[i]<maxn)
{
maxn=dp[i];
ans.clear();
ans.pb(i);
}
else if(dp[i]==maxn)
ans.pb(i);
}
printf("%d\n",maxn);
for(int v:ans)
printf("%d ",v);
printf("\n");
return 0;
}
CF#135 D. Choosing Capital for Treeland 树形DP的更多相关文章
- CF219D. Choosing Capital for Treeland [树形DP]
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...
- CF 219D Choosing Capital for Treeland 树形DP 好题
一个国家,有n座城市,编号为1~n,有n-1条有向边 如果不考虑边的有向性,这n个城市刚好构成一棵树 现在国王要在这n个城市中选择一个作为首都 要求:从首都可以到达这个国家的任何一个城市(边是有向的) ...
- Codeforces 219D - Choosing Capital for Treeland(树形dp)
http://codeforces.com/problemset/problem/219/D 题意 给一颗树但边是单向边,求至少旋转多少条单向边的方向,可以使得树上有一点可以到达树上任意一点,若有多个 ...
- [codeforces219D]Choosing Capital for Treeland树形dp
题意:给出一棵树,带有向边,找出某个点到达所有点需要反转的最少的边. 解题关键:和求树的直径的思路差不多,将求(父树-子树)的最大值改为求特定值.依然是两次dfs,套路解法. 对树形dp的理解:树形d ...
- CodeForces 219D Choosing Capital for Treeland (树形DP)经典
<题目链接> 题目大意: 给定一个有向树,现在要你从这颗树上选一个点,使得从这个点出发,到达树上其它所有点所需翻转的边数最小,输出最少需要翻转的边数,并且将这些符合条件的点输出. 解题分析 ...
- 【CF】135 Div2 Choosing Capital for Treeland
树形结构,挺有意思的题目.不难. /* 219D */ #include <iostream> #include <string> #include <map> # ...
- Codeforces 219D. Choosing Capital for Treeland (树dp)
题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...
- 树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
题目传送门 /* 题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+1 树形DP:首先假设1为根节点,自下而上计算dp[1](根节点到其他点的距离),然后再从1开始,自上而下计 ...
- CF 219 D:Choosing Capital for Treeland(树形dp)
D. Choosing Capital for Treeland 链接:http://codeforces.com/problemset/problem/219/D The country Tre ...
随机推荐
- Obtain The String CodeForces - 1295C binary_search+思维
妈耶,,,被B题卡到哭,C题一发就过了... 字符串问题.首先用vector记录每个字符出现的位置,然后对字符串t的每个字符,用二分查找函数查找,注意用upper_bound查找,对于字符i,首先用变 ...
- 常见web漏洞整理之进击吧xss!!!
XSS在线测试环境: http://xss-quiz.int21h.jp/ https://brutelogic.com.br/xss.php 这两个站对xss的理解很有帮助!!! 参考链接: htt ...
- 使用User Agent和代理IP隐藏身份
一.为何要设置User Agent 有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的 ...
- JWT验证机制【刘新宇】【Django REST framework中使用JWT】
JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...
- 随笔之——浮动(float)的影响及其清除、、clear与overflow-hidden清除float的不同!!!
一.浮动(float)对内联元素的影响. 1.我们都知道,内联元素(例如:span/img/input...)在正常情况下不可以对其设置宽高的,它的大小之只和它内部内容的多少有关. 我们怎样才可以对其 ...
- 前端面试题之HTML和css-很实用的知识点
display: none; 与 visibility: hidden; 的区别 相同: 它们都能让元素不可见 区别: display:none;会让元素完全从渲染树中消失,渲染的时候不占据任何空间: ...
- sql注入 pikachu
闭合条件的探测 数字型注入 burp抓包 分别测试 id=1 and 1=1和id=1 or 1=1 存在漏洞 字符型注入 ' 报错 探测闭合条件 ' order by 1# 未报错.构成闭合 同上有 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第四周作业
<Linux内核原理与分析>第四周作业 一.上周问题总结: 虚拟机环境缺少部分库文件 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境使用gdb跟踪调试内核 1.1 在该环境下输入 ...
- 获取 保存 系统信息 [Windows]
出处:https://www.technig.com/find-windows-10-system-information/ 在“运行”里,运行 msinfo32. System Informatio ...
- Hyperledger Fabric基础知识
文章目录 什么是Hyperledger Fabric? Hyperledger架构是怎么工作的? Hyperledger交易如何执行 总结 Hyperledger Fabric基础知识 本文我们会介绍 ...