博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ 1230 Placing Lampposts(树形DP)
阅读量:6800 次
发布时间:2019-06-26

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

题目链接:

题意:给定一个森林。每个节点上安装一个灯可以覆盖与该节点相连的所有边。选择最少的节点数num覆盖所有的边。在num最小的前提下,合理放置num个灯使得被两个灯覆盖的边最多?

思路:f[u][0]表示u不放灯的最小灯数,b[u][0]表示相应的被两个灯覆盖的边的最大数。f[u][1],b[u][1]类似。

 

#include 
#include
#include
using namespace std;struct node{ int v,next;};int C,num=0;node edges[2005];int head[1005],e;int n,m,f[1005][2],b[1005][2];void Add(int u,int v){ edges[e].v=v; edges[e].next=head[u]; head[u]=e++;}void DFS(int u,int c,int p){ if(f[u][c]!=-1) return; f[u][c]=c;b[u][c]=0; int i,v; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; if(v==p) continue; if(c) { DFS(v,1,u); DFS(v,0,u); if(f[v][0]
b[v][1]+1) { f[u][c]+=f[v][0]; b[u][c]+=b[v][0]; } else { f[u][c]+=f[v][1]; b[u][c]+=b[v][1]+1; } } else { DFS(v,1,u); f[u][c]+=f[v][1]; b[u][c]+=b[v][1]; } }}int main(){ for(scanf("%d",&C);C--;) { scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); e=0; int i,u,v; for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); Add(u,v); Add(v,u); } memset(f,-1,sizeof(f)); int ans1=0,ans2=0,x0,y0,x1,y1; for(i=0;i
b[i][1]) { ans1+=f[i][0]; ans2+=b[i][0]; } else { ans1+=f[i][1]; ans2+=b[i][1]; } } printf("Case %d: %d %d %d\n",++num,ans1,ans2,m-ans2); } return 0;}

 

  

 

 

转载地址:http://uquwl.baihongyu.com/

你可能感兴趣的文章
检测设备朝向和移动
查看>>
iOS开发网络篇—监测网络状态
查看>>
vs------密钥
查看>>
Cygwin安装时,选择163的源后出错:Unable to get setup.ini from <http://mirrors.163.com/cygwin/>...
查看>>
C# Excel数据有效性
查看>>
java 调用微信截图工具
查看>>
【Hadoop】伪分布式环境搭建、验证
查看>>
李洪强经典面试案例33-如何面试 iOS 工程师
查看>>
[LeetCode] Sum of Left Leaves 左子叶之和
查看>>
【温故而知新-Javascript】使用 Window 对象
查看>>
Nginx location 匹配顺序整理
查看>>
javascript (function() { /* code */ })() 自执行函数
查看>>
MVC数据库数据分页显示
查看>>
CreatarGlobe实现多机立体显示方案(初稿)
查看>>
JAVA设计模式初探之桥接模式
查看>>
拉链表-增量更新方法一
查看>>
有什么样的博客手机客户端
查看>>
听10秒就会喜欢上的歌曲
查看>>
去掉发送到里的选项
查看>>
windows server 2008修改远程桌面连接数
查看>>