博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ PT07X Vertex Cover
阅读量:4880 次
发布时间:2019-06-11

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

题目意思: 一棵树,找到最少的点能覆盖到所有的边,(也就是每条边俩端 至少有一个在你找到的集合);

  解法:每条边只能被俩个点中的一个,或全部覆盖所以我们有树形DP来解:

DP[num][flag]//代表在子树NUM全部被覆盖的情况下,flag=1,这个店也被覆盖:flag=false  这个店没被覆盖;

  那么有了这样的想法大妈就很好写了毕竟树形DP  主要的初始化和合并的状态:

#include 
#include
#include
#include
#include
using namespace std;const int maxn=100003;int n;int dp[maxn][2];struct Edge{ int to,pre; Edge (int to=0,int pre=0):to(to),pre(pre){}};Edge edge[maxn*2];int head[maxn],pos;inline void add_edge(int s,int to){ edge[pos]=Edge(to,head[s]); head[s]=pos++;}inline void inint(){ memset(head,-1,sizeof(head)); pos=0;}void dfs(int pa,int s){ dp[s][0]=0; dp[s][1]=1; for(int w=head[s];~w;w=edge[w].pre) { Edge &tmp=edge[w]; if(tmp.to==pa)continue; dfs(s,tmp.to); dp[s][0]+=dp[tmp.to][1]; dp[s][1]+=min(dp[tmp.to][0],dp[tmp.to][1]); }}int main(){ int a,b; while(~scanf("%d",&n)) { inint(); memset(dp,0,sizeof(dp)); for(int i=2;i<=n;i++) { scanf("%d%d",&a,&b); add_edge(a,b); add_edge(b,a); } dfs(-1,1); printf("%d\n",min(dp[1][0],dp[1][1])); } return 0;}

 

转载于:https://www.cnblogs.com/shuly/p/3877405.html

你可能感兴趣的文章
并查集hdu4424
查看>>
jdbc之分页查询
查看>>
sbrk and coreleft
查看>>
树型DP
查看>>
怎么在ubuntu上使用pidgin登陆QQ
查看>>
思维的惰性
查看>>
【Android】学习记录<1> -- 初识ffmpeg
查看>>
关于IAsyncResult接口的CompletedSynchronously属性
查看>>
编译原理——算符优先分析文法(附源代码)
查看>>
jboss的启动过程
查看>>
渲染部分
查看>>
力扣——所有可能的路径
查看>>
关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别
查看>>
解密module_init幕后的故事
查看>>
9个移动网站优化的最佳实践
查看>>
李昌镐:苍老的青春(转载) 韩国围棋职业棋手
查看>>
JPA 使用报Named query not found错误
查看>>
FTP命令使用详解
查看>>
walmart weekly sales
查看>>
面试题07_用两个栈实现队列——剑指offer系列
查看>>