博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 219D 树形dp
阅读量:4981 次
发布时间:2019-06-12

本文共 1145 字,大约阅读时间需要 3 分钟。

#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 2*1e5+100;int dp[maxn]; //dp[i]表示以i为根遍历全部的点的最小的权值。struct Edge{ int u,v,w; int next; Edge(int u=0,int v=0,int w=0,int next=0): u(u), v(v), w(w), next(next) {}}edges[maxn*2];int head[maxn],cnt;int sum; //以1为根的树至少要修改的边数。int ans;void addedge(int u,int v){ edges[cnt] = Edge(u,v,0,head[u]); head[u] = cnt++; edges[cnt] = Edge(v,u,1,head[v]); head[v] = cnt++;}void dfs1(int u,int fa){ for(int i=head[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(e.v == fa) continue; sum += e.w; dfs1(e.v,u); }}void dfs2(int u,int fa){ for(int i=head[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(e.v == fa) continue; if(e.w == 1) dp[e.v] = dp[u] - 1; //由于父亲节点的dp[u]已经算出,只需要更新就是了。 else dp[e.v] = dp[u] + 1; ans = min(ans,dp[e.v]); dfs2(e.v,u); }}int main(){ //freopen("E:\\acm\\input.txt","r",stdin); int n; cin>>n; memset(head,-1,sizeof(head)); cnt = 0; for(int i=1;i
View Code

 

 

转载于:https://www.cnblogs.com/acmdeweilai/p/3320455.html

你可能感兴趣的文章
C# Linq
查看>>
解析ISO8583报文实例
查看>>
BeautifulSoup模块详解
查看>>
PHP内核研究(内存管理1)
查看>>
hdu 2547
查看>>
[恢]hdu 2504
查看>>
关于golang.org/x包问题
查看>>
PHP $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 之间的区别
查看>>
第一次过程性考核
查看>>
linux 安装 mysql
查看>>
Java中HashMap,LinkedHashMap,TreeMap的区别
查看>>
老菜鸟说给新菜鸟的存储基础知识
查看>>
web.xml详解
查看>>
插入排序
查看>>
浅谈微信公众平台运用的场景
查看>>
Moctf--Pubg题目
查看>>
ORM框架与mysql数据库的无缝对接
查看>>
在centos上使用yum安装rabbitmq-server
查看>>
SpringBoot项目如何打War包
查看>>
Managing Dynamic Objects in C++
查看>>