博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1848--Tree ——树形dp
阅读量:4352 次
发布时间:2019-06-07

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

题意:给你一个树,问你最少连几条边可以让树中的每一个节点在且只在一个环内。如果无法完成就输出-1。

我们设dp[i][0]为根节点为i的树变成每一个节点都在且只在一个环里所需要的最小边数。dp[i][1]为除了根节点i外其他点都在且只在一个环里所需要的最小边数。

dp[i][2]为除了根节点和一个子节点(以及子节点可有可无的链)都在且只在一个环里所需要的最小边数。

这样我们的状态转移需要考虑以下4种情况:

(第一张图最上面应该是dp[i][1]  当时写错了不好改)

 

 

  

具体代码如下:

#include
#include
using namespace std;#define ll long longconst ll inf=100000000;ll dp[105][3];vector
a[105];void solve(int u,int f){ int i,j; if(a[u].size()==1&&a[u][0]==f) { dp[u][0]=inf; dp[u][1]=0; dp[u][2]=inf; // return; } for(i=0;i
>n; for(i=0;i
>x>>y; a[x].push_back(y); a[y].push_back(x); } for(i=1;i<=n;i++) for(j=0;j<=2;j++) dp[i][j]=inf; solve(1,-1); ll ans=inf; ans=dp[1][0]; if(ans==inf) cout<<"-1"<

 

转载于:https://www.cnblogs.com/wsblm/p/10741774.html

你可能感兴趣的文章
【nosql实现企业网站系列之一】mongodb的安装
查看>>
短信服务供应商价格总览
查看>>
获取本机IP(考虑多块网卡、虚拟机等复杂情况)
查看>>
笔记之_java整理ORM框架
查看>>
CentOS下安装python3.x版本
查看>>
CAP定理(原则)以及BASE理论
查看>>
「玩转树莓派」搭建属于自己的云盘服务
查看>>
有道语料库爬虫
查看>>
VS2019 实用设置
查看>>
for循环语句之求和,阶乘,求偶,求n次篮球蹦起高度
查看>>
CFileDialog
查看>>
[转载]EXTJS学习
查看>>
SQL Server2012完全备份、差异备份、事务日志备份和还原操作
查看>>
Flash动画播放
查看>>
springmvc+mybatis+dubbo+zookeeper 分布式架构
查看>>
HDUOJ-----Computer Transformation
查看>>
HDUOJ-----2838Cow Sorting(组合树状数组)
查看>>
自定义控件之---抽屉式弹窗控件.
查看>>
一款纯css3实现的机器人看书动画效果
查看>>
加班与效率
查看>>