http://codeforces.com/problemset/problem/219/D

题意:给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到u去,则要逆转该边方向)如果有多个这样的点,则升序输出所有

思路:把边的方向化为权值,正向为1,逆向为0。

问题转化为找哪些点的在遍历全图后总权值最大。

一个节点可以走自己的子树,也可以走自己的父节点,权值分别记为dps[i] , dpf[i]。

设ans[i] = dps[i] + dpf[i]。权值越大,需要逆转的越少。

具体见代码注释。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)
#define lld %I64d
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define scan(d) scanf("%d",&d)
#define scanl(d) scanf("%I64d",&d)
#define scann(n,m) scanf("%d%d",&n,&m)
#define scannl(n,m) scanf("%I64d%I64d",&n,&m)
#define CL(a,k)  memset(a,k,sizeof(a))
#define LL long long
#define N 200005
#define mod 1000000007
inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}struct Edge
{int v,w;
};
vector<Edge> G[N];
int tot;
void addedge(int u,int v,int w)
{G[u].push_back(Edge){v,w};
}int dps[N],dpf[N];//son fathervoid dfs(int u,int fa)//子树能得到的权值
{for(int i=0;i<G[u].size();i++){int v=G[u][i].v;int w=G[u][i].w;if(v==fa) continue;dfs(v,u);dps[u] = dps[u]+w+dps[v];}
}void dfs2(int u,int fa)//走父亲节点能得到的权值
{for(int i=0;i<G[u].size();i++){int v=G[u][i].v;int w=G[u][i].w;if(v==fa) continue;dpf[v] = dpf[u] + (w?0:1) + (dps[u] -( dps[v] + w));//走父亲节点时减去包含自己的dps[v]+wdfs2(v,u);}
}
//输出每个节点并且排序————建个结构体,重载<
struct node
{int w,id;//权值,对应节点编号
}ans[N];
bool cmp(node a,node b)
{return a.v>b.v || a.v==b.v&&a.id<b.id;
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int n; scan(n);CL(head,-1); tot=0;int u,v;REP(i,1,n){scann(u,v);addedge(u,v,1);//顺向为1addedge(v,u,0);//逆向为0}mst(dps,0);dfs(1,-1);dfs2(1,-1);for(int i=1;i<=n;i++){ans[i].w = dps[i]+dpf[i];ans[i].id = i;//printf("i=%d %d %d\n",i,dps[i],dpf[i]);}sort(ans+1,ans+n+1,cmp);//降序排序,权值越大,需要逆转的道路越少int num=1;int sum = n-1 - ans[1].v;for(int i=2;i<=n;i++)if(ans[i].v==ans[1].v)num++;printf("%d\n",sum);for(int i=1;i<=num;i++)printf("%d%c",ans[i].id,i==num?'\n':' ');return 0;
}

参考:https://blog.csdn.net/angon823/article/details/52316220

树形DP——Codeforces Choosing Capital for Treeland相关推荐

  1. Codeforces - Choosing Capital for Treeland

    题目链接:Codeforces - Choosing Capital for Treeland 显然,如果确定首都之后,我们可以O(n)计算出这个点的答案. 然后这个东西可以换根吗?显然是可以的.换根 ...

  2. 【CodeForces - 219D 】Choosing Capital for Treeland (树形dp)

    题干: The country Treeland consists of n cities, some pairs of them are connected with unidirectional  ...

  3. Codeforces 1088E Ehab and a component choosing problem(树形DP)

    Codeforces 1088E Ehab and a component choosing problem(树形DP) 题意 给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大.如果有多 ...

  4. CodeForces - 1088E Ehab and a component choosing problem(树形dp)

    题目链接:点击查看 题目大意:给出一棵树,每个顶点都有权值,在树上选出k个相互独立的连通块,使得其权值和的平均值最大的情况下选的块数最多 题目分析:这个题目中平均值的优先级大于块数,那么我们可以在树上 ...

  5. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  6. codeforces 816 E. Karen and Supermarket(树形dp)

    题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...

  7. 【Codeforces Round #614(div2)】E-Xenon's Attack on the Gangs(树形dp)

    一.题目链接 https://codeforces.com/contest/1293/problem/E 二.题意 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~n-2不重复的值 ...

  8. 【Christmas Game】【CodeCraft-21 and Codeforces Round #711 (Div. 2)】【Nim-博弈】【树形DP】【拆分树】

    CodeCraft-21 and Codeforces Round #711 (Div. 2) Christmas Game Nim-博弈 树形DP 拆分树 牛客链接 https://ac.nowco ...

  9. Codeforces 671D. Roads in Yusland(树形DP+线段树)

    调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果 ...

最新文章

  1. 你真的了解软件测试行业吗?
  2. 赛门铁克运维注意事项
  3. PHP框架自动加载类文件原理
  4. 财务报表“难看”,怎么解决?
  5. python-select异步IO
  6. 查询某字段不重复记录的SQL语句
  7. mac电脑利用file和iconv命令修改文件编码
  8. linux默认的系统管理账号是,从Linux到Solaris系统管理---1
  9. 大数据开发常用命令大全 大全
  10. Public Private Protect Inheritance and access specifiers
  11. SpringBoot JPA 批量插入实现,使用原生sql解决SaveAll插入慢的问题
  12. 2个人怎么一起玩军旗游戏_让我们一起玩:建立游戏社区
  13. ElasticSearch系列03:ES的数据类型
  14. 免费网站空间申请地址
  15. 利用百度地图API制作房产酒店地图
  16. 单词数据库 mysql_英语单词数据库 mysql
  17. adb 获取屏幕截图、录制视频
  18. Reader电子书阅读器优化实战(一)
  19. ad10捕捉pad中点_AD转投PADS门下新手走线及捕捉焊盘中心问题
  20. 二八法则(The 80/20 Principle)

热门文章

  1. 小程序用thinkPHP上传文件到腾讯云对象存储空间
  2. Zookeeper工作原理
  3. 如何获取有性能问题的SQL
  4. c语言:输出一个菱形图
  5. 设计模式之美:Memento(备忘录)
  6. 字典 update()
  7. UT2416 wince 6.0 调试LCD35 触摸驱动参考
  8. 使用母版页后出现控件,使用FindControl找不到指定控件
  9. python shell背景颜色改变_科学网—Python Shell Background Color - 李旭的博文
  10. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码