博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1192-最优连通子集解题报告
阅读量:4624 次
发布时间:2019-06-09

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

简单的树形dp,dp[i][0]表示不选i节点以i为根的子树获得的最大值。既然根节点不选,那么子节点只能选一个,否则无法保证连通。根节点若选的话则把所有状态值为正的节点都选了既为最优值

View Code
1 #include
2 #include
3 #define N 1005 4 int max(int a,int b) 5 { 6 return a>b?a:b; 7 } 8 int dir[4][2]={
0,1,0,-1,1,0,-1,0}; 9 int head[N],t;10 struct edge11 {12 int v,next;13 };14 edge e[2*N];15 int val[N];16 struct point17 {18 int x,y;19 };20 point p[N];21 void add(int u,int v)22 {23 e[t].v=v;24 e[t].next=head[u];25 head[u]=t++;26 }27 int dp[N][2];28 bool used[N];29 void init()30 {31 memset(used,0,sizeof(used));32 memset(head,-1,sizeof(head));33 t=0;34 }35 void dfs(int u)36 {37 used[u]=true;38 int i,v;39 dp[u][0]=0;40 dp[u][1]=val[u];41 for(i=head[u];i>=0;i=e[i].next)42 {43 v=e[i].v;44 if(!used[v])45 {46 dfs(v);47 dp[u][0]=max(dp[u][0],max(dp[v][0],dp[v][1]));48 if(dp[v][1]>0)49 dp[u][1]+=dp[v][1];50 }51 }52 }53 int main()54 {55 int n;56 int i,j,k;57 scanf("%d",&n);58 init();59 for(i=1;i<=n;i++)60 {61 scanf("%d%d%d",&p[i].x,&p[i].y,&val[i]);62 for(j=1;j

转载于:https://www.cnblogs.com/caozhenhai/archive/2012/06/07/2539087.html

你可能感兴趣的文章
MyBatis的动态SQL详解
查看>>
android - 多屏幕适配相关
查看>>
Fedora Linux 18 延期至年底
查看>>
Spring Framework 3.2 RC1 发布
查看>>
基于ios开发点餐系统应用(附带源码)
查看>>
Xenia and Weights(深度优先搜索)
查看>>
文件包含漏洞进阶篇
查看>>
JavaScript的self和this使用小结
查看>>
CSS3.0:透明度 Opacity
查看>>
Arduino Wire.h(IIC/ I2C)语法
查看>>
web高并发的解决方案
查看>>
OC中的NSNumber、NSArray、NSString的常用方法
查看>>
android 用ImageSwitcher+Gallery实现图片浏览效果 分类: ...
查看>>
STM32里面的一些小函数——assert_param,PUTCHAR_PROTOTYPE
查看>>
Java分布式锁的三种实现方案(redis)
查看>>
运行客户端程序报读取配置文件出错的解决方案
查看>>
day 5 - 2 字典(dict)练习
查看>>
微引擎的自定义菜单40063错误解决
查看>>
JAVA wait(), notify(),sleep具体解释
查看>>
数据挖掘十大经典算法
查看>>