题目链接:http://codeforces.com/problemset/problem/219/D

题意:

  给你一棵树,n个节点。

  树上的边都是有向边,并且不一定是从父亲指向儿子的。

  你可以任意翻转一些边的方向。

  现在让你找一个节点,使得从这个节点出发能够到达其他所有节点,并保证翻转边的数量最小。

  问你最少翻转多少条边,并输出所有满足此条件的节点编号。

题解:

  本题要解两个dp: dp1 & dp2

  首先考虑dp1:

    表示状态:

      dp1[i]表示使节点i能够到达i的子树中的所有节点,翻转边的最小数量。

    如何转移:

      dp1[i] = ∑ (dp1[son] + 边<i,son>由i指向son ? 0 : 1)

      dfs一遍即可。

  然后求dp2:

    表示状态:

      dp2[i]表示使节点i能够到达这棵树的所有节点,翻转边的最小数量。

    如何转移:

      dp2[i] = dp2[par] + 边<par,i>是否由par指向i ? 1 : -1

      如果边<par,i>由par指向i,那么在dp2[par]中这条边是不会被翻转的,所以此时应该将它翻转,代价+1。

      如果边<par,i>由i指向par,那么在dp2[par]中这条边已经被翻转了一次,然而在dp2[i]中是不需要翻转的,所以将dp2[par]中多余的那次翻转减掉就好。

    边界条件:

      dp2[1] = dp1[1]

      (默认根节点为1)

  所以最终答案为dp2[i]中的最小值,然后将所有dp2[i]等于ans的节点输出就好啦。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 200005
#define INF 1000000000 using namespace std; struct Edge
{
int dest;
bool flag;
Edge(int _dest,bool _flag)
{
dest=_dest;
flag=_flag;
}
Edge(){}
}; int n;
int ans=INF;
int dp1[MAX_N];
int dp2[MAX_N];
vector<Edge> edge[MAX_N]; void read()
{
cin>>n;
int x,y;
for(int i=;i<n;i++)
{
cin>>x>>y;
edge[x].push_back(Edge(y,true));
edge[y].push_back(Edge(x,false));
}
} void dfs1(int now,int p)
{
dp1[now]=;
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dest!=p)
{
dfs1(temp.dest,now);
dp1[now]+=dp1[temp.dest]+(!temp.flag);
}
}
} void dfs2(int now,int p,bool d)
{
if(now==) dp2[now]=dp1[now];
else dp2[now]=dp2[p]+(d?:-);
ans=min(ans,dp2[now]);
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dest!=p) dfs2(temp.dest,now,temp.flag);
}
} void work()
{
dfs1(,-);
dfs2(,-,);
cout<<ans<<endl;
for(int i=;i<=n;i++)
{
if(dp2[i]==ans) cout<<i<<" ";
}
cout<<endl;
} int main()
{
read();
work();
}

最新文章

  1. NOIp2016 Day1&amp;Day2 解题报告
  2. spring加载过程,源码带你理解从初始化到bean注入
  3. Java 之 GUI
  4. 弥补学生时代的遗憾~C#注册表情缘
  5. Eclipse启动Tomcat错误:Several ports (8005,8009) required by Tomcat v6.0 Server at localhost are already
  6. CSS Questions:Front-end Developer Interview Questions
  7. 项目文件中含有两个config文件,app.config与app1.config,如何获取app1.config中的配置
  8. set and Sequence theory
  9. 安卓弹出对话框——Alertdialog
  10. 从 mian 函数开始一步一步分析 nginx 执行流程(三)
  11. css中表格的table-layout属性特殊用法
  12. 通过yocto给p1010rdb定制linux,并启动linux
  13. Clojure学习03:数据结构(集合)
  14. hdu1217Arbitrage--解题报告
  15. Cocos2d-精灵的几个常识
  16. 安装可以查看PMM 源码的Go环境
  17. 如何查看目前正在使用的Windows10是哪个版本?
  18. 开发 Swift 和 Objective-C 混编的 Framework
  19. 【POJ2409】Let it Bead P&#243;lya定理
  20. python 获取中文文件名的输出

热门文章

  1. 一个方便的图片载入框架——ImageViewEx
  2. 快速用CMD打开当前目录
  3. Python 自动化之验证码识别
  4. liunx 下安装 php_screw 扩展 以及报错处理
  5. 批量删除redis某个键值
  6. ios开发:如何用js调用ios
  7. EasyDSS视频点播服务器实现多分辨率/多码率无缝切换的办法
  8. Spring中的国际化资源以及视图跳转
  9. zabbix server is not running解决办法
  10. POJ 286 Y2K Accounting Bug【简单暴力】