Codeforces 219D Choosing Capital for Treeland 树型DP
来源:互联网 发布:微信js sdk 分享 编辑:程序博客网 时间:2024/06/08 20:17
树型DP。
一棵树,其中每条边都是有向的,问以哪些节点为起点遍历整棵树,所需要的反向边最少。
给边加上权值,反向权值为1,正向权值为0.
先dfs,递归求每个节点到它的所有儿子节点需要反向多少条边,把所有路的权值加起来即可。
这时,根节点到每个节点的反向边数已经求出。
再bfs。每个节点与它的根节点相比,反向情况仅仅相差它与根节点之间的这一条边。既然如此,慢慢向后推就是了。
#include <cstdio>#include <iostream>#include <string.h>#include <string> #include <map>#include <queue>#include <vector>#include <set>#include <algorithm>#include <math.h>#include <cmath>#define mem0(a) memset(a,0,sizeof(a))#define meminf(a) memset(a,0x3f,sizeof(a))using namespace std;typedef long long ll;typedef long double ld;const int maxn=200005,inf=0x3f3f3f3f;const ll llinf=0x3f3f3f3f3f3f3f3f; int down[maxn],sum[maxn],fa[maxn],head[maxn];bool visit[maxn];int num;vector<int> v[maxn]; struct Edge {int from,to,pre,dist;};Edge edge[maxn*2];void addedge(int from,int to) {edge[num]=(Edge){from,to,head[from],0};head[from]=num++;edge[num]=(Edge){to,from,head[to],1};head[to]=num++;}void dfs(int now) {down[now]=0;visit[now]=1;for (int i=head[now];i!=-1;i=edge[i].pre) {int to=edge[i].to;if (!visit[to]) {dfs(to);fa[to]=now;down[now]+=edge[i].dist+down[to];}}}int main() {//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout); int n,i,x,y; num=0; memset(head,-1,sizeof(head)); scanf("%d",&n); for (i=1;i<n;i++) { scanf("%d%d",&x,&y); addedge(x,y); } mem0(visit); dfs(1); queue<int> q; mem0(visit); q.push(1); visit[1]=1; mem0(sum); sum[1]=down[1]; v[sum[1]].push_back(1); int ans=sum[1]; while (!q.empty()) { int now=q.front(); q.pop(); if (now!=1) { sum[now]+=down[now]; sum[now]+=sum[fa[now]]-down[now]; v[sum[now]].push_back(now); ans=min(ans,sum[now]); } for (i=head[now];i!=-1;i=edge[i].pre) { int to=edge[i].to; if (!visit[to]) { visit[to]=1; q.push(to); if (edge[i].dist==0) sum[to]=1; else sum[to]=-1; } } } printf("%d\n",ans); sort(v[ans].begin(),v[ans].end()); int size=v[ans].size(); for (i=0;i<size-1;i++) { printf("%d ",v[ans][i]); } printf("%d\n",v[ans][size-1]);return 0;}
阅读全文
0 0
- Codeforces 219D Choosing Capital for Treeland 树型DP
- Codeforces 219D Choosing Capital for Treeland【思维+树型Dp】
- codeforces 219D D. Choosing Capital for Treeland(树形dp)
- CodeForces 219D Choosing Capital for Treeland (树形dp)
- CodeForces 219D Choosing Capital for Treeland | 树形dp
- Codeforces 219D - Choosing Capital for Treeland(树形dp)
- codeforces 219D Choosing Capital for Treeland(树形DP)
- CodeForces 219D Choosing Capital for Treeland (树形DP)
- CodeForces 219D-H - Choosing Capital for Treeland-树DP
- CodeForces 219D Choosing Capital for Treeland(树形DP)
- codeforces 219D Choosing Capital for Treeland (树形dp)
- 【树形DP】codeforces 219D Choosing Capital for Treeland
- Codeforces 219D Choosing Capital for Treeland DP(Tree)
- CodeForces 219D Choosing Capital for Treeland
- codeforces 218D Choosing Capital for Treeland 树形DP
- 树形dp 219D Choosing Capital for Treeland
- [CF 219D]Choosing Capital for Treeland[树形DP]
- cf 219D Choosing Capital for Treeland 树形dp
- 智能指针作参数
- Deepin15.4.1下CLion第一个Qt例子
- 坚持写博客,记录自己生活
- 查看Unity使用Mono版本
- DGUT oj(001)
- Codeforces 219D Choosing Capital for Treeland 树型DP
- 微信小程序入门教程--列表渲染多层嵌套循环及wx:key的使用
- 删除顽固性node_modules
- Oracle 中 decode 函数用法(不只是翻译功能哦!)
- 微信小程序 列表渲染 wx:for
- MySQL 主从复制架构之单主模型与半同步复制
- Android内存优化
- Windows 技巧
- 解决centos7 开机/etc/rc.local 不执行的问题