最优连通子集
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 2589   Accepted: 1382

Description

众所周知,我们可以通过直角坐标系把平面上的任何一个点P用一个有序数对(x, y)来唯一表示,如果x, y都是整数,我们就把点P称为整点,否则点P称为非整点。我们把平面上所有整点构成的集合记为W。
定义1 两个整点P1(x1, y1), P2(x2, y2),若|x1-x2| + |y1-y2| = 1,则称P1, P2相邻,记作P1~P2,否则称P1, P2不相邻。

定义 2 设点集S是W的一个有限子集,即S = {P1, P2,..., Pn}(n >= 1),其中Pi(1 <= i <= n)属于W,我们把S称为整点集。

定义 3 设S是一个整点集,若点R, T属于S,且存在一个有限的点序列Q1, Q2, ?, Qk满足:

1. Qi属于S(1 <= i <= k);

2. Q1 = R, Qk = T;

3. Qi~Qi + 1(1 <= i <= k-1),即Qi与Qi + 1相邻;

4. 对于任何1 <= i < j <= k有Qi ≠ Qj;

我们则称点R与点T在整点集S上连通,把点序列Q1, Q2,..., Qk称为整点集S中连接点R与点T的一条道路。

定义4 若整点集V满足:对于V中的任何两个整点,V中有且仅有一条连接这两点的道路,则V称为单整点集。

定义5 对于平面上的每一个整点,我们可以赋予它一个整数,作为该点的权,于是我们把一个整点集中所有点的权的总和称为该整点集的权和。

我们希望对于给定的一个单整点集V,求出一个V的最优连通子集B,满足:

1. B是V的子集

2. 对于B中的任何两个整点,在B中连通;

3. B是满足条件(1)和(2)的所有整点集中权和最大的。

Input

第1行是一个整数N(2 <= N <= 1000),表示单整点集V中点的个数;

以下N行中,第i行(1 <= i <= N)有三个整数,Xi, Yi,
Ci依次表示第i个点的横坐标,纵坐标和权。同一行相邻两数之间用一个空格分隔。-10^6 <= Xi, Yi <= 10^6;-100
<= Ci <= 100。

Output

仅一个整数,表示所求最优连通集的权和。

Sample Input

5
0 0 -2
0 1 1
1 0 1
0 -1 1
-1 0 1

Sample Output

2

Source

题意:就是要在一棵强连通的树中找一个权值最大强连通的子树

分析:dp[i][1] 如果选了该结点,那么它的子节点在选与不选中选权值大的     dp[i][1] = dp[i][1] + max(dp[i_son][1],dp[i_son][0]) i_son是i的所有子树
     dp[i][0] 如果不选该结点,那么它的子节点有且只能选一个才能够保证强连通   dp[i][0] = max(dp[i][0],max(dp[i_son][1],dp[i_son][0]))

边只开了N WA了,,一定要记得是2*N ,还有就是math.h的fabs会报 CE ,还是用stdlib.h中的 abs吧

///dp[i][1] 如果选了该结点,那么它的子节点在选与不选中选权值大的
///dp[i][0] 如果不选该结点,那么它的子节点有且只能选一个才能够保证强连通
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define N 1005
using namespace std; int dp[N][]; ///dp[i][0]代表不选择i结点以i为根节点的子树能够获得最大的权,
///dp[i][1]代表选择i结点以i为根节点的子树能够获得最大的权
int head[N];
struct Edge
{
int u,v,next;
} edge[*N]; ///!!!!开两倍
void addEdge(int u,int v,int &k)
{
edge[k].u = u,edge[k].v = v;
edge[k].next = head[u],head[u]=k++;
}
int vis[N];
void dfs(int u)
{
vis[u]=;
for(int k=head[u]; k!=-; k=edge[k].next)
{
int v = edge[k].v;
if(!vis[v])
{
dfs(v);
dp[u][]+= max(dp[v][],dp[v][]);
dp[u][] = max(dp[u][],max(dp[v][],dp[v][]));
} }
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-,sizeof(head));
memset(dp,,sizeof(dp));
memset(vis,,sizeof(vis));
int x[N],y[N],w,tot=;
for(int i=; i<=n; i++)
{
scanf("%d%d%d",&x[i],&y[i],&w);
dp[i][]=w;
for(int j=; j<i; j++)
{
if((abs(x[i]-x[j])+abs(y[i]-y[j]))==)
{
addEdge(i,j,tot);
addEdge(j,i,tot);
}
}
}
dfs();///随便选取一个根
printf("%d\n",max(dp[][],dp[][]));
} }

poj 1192(树形DP)的更多相关文章

  1. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  2. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  3. poj 2486( 树形dp)

    题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...

  4. poj 3140(树形dp)

    题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...

  5. Strategic game(POJ 1463 树形DP)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7490   Accepted: 3483 De ...

  6. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  7. poj 3345 树形DP 附属关系+输入输出(好题)

    题目连接:http://acm.hust.edu.cn/vjudge/problem/17665 参考资料:http://blog.csdn.net/woshi250hua/article/detai ...

  8. POJ 1155 树形DP

    题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 转自:http://www.cnblogs.com/andre050 ...

  9. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

随机推荐

  1. Elicpse新建userLibrary导入jar包时抛出NotFoundException异常

    最近刚开始学Struts2.0框架.再导入jar包的时候突然心血来潮.为方便区分jar包的功能,于是想在WEB-INF -> lib 目录下想新建一个struts文件夹,以方便分类查看. 像上图 ...

  2. Java面试题(下)

    这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题, ...

  3. can be found for element 'tx:annotation-driven'

    错误描述: ERROR [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (ContextLoader.java:308) - Cont ...

  4. 深入研究java.lang.Runtime类(转)

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  5. servletContex.getRealPath 获取的是拼接后的地址 是虚假的

    servletContex.getRealPath 获取的是拼接后的地址 是虚假的

  6. Hadoop Yarn on Docker

    搭建Hadoop Yarn on Docker 一.概览 Docker基于Linux Container技术整合了一堆易用的接口用于构建非常轻量级的虚拟机.Docker Container Execu ...

  7. HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)

    描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定 ...

  8. 2017博普杯 东北大学邀请赛(B. Drink too much water)(贪心+树链剖分)

    题目地址:https://oj.neu.edu.cn/problem/1204 题目大意: 其实就是树上的线段覆盖, 给出一棵n个结点的树,然后给出树上的一些路径进行覆盖,然后要求选取最少的点,能够把 ...

  9. 洛谷 P2414 [NOI2011]阿狸的打字机 解题报告

    P2414 [NOI2011]阿狸的打字机 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母 ...

  10. size用法小记

    By francis_hao    Feb 14,2017 列出二进制文件各个段的大小和总大小 概述 选项解释 -A -B --format=compatibility 选择显示的格式, -A = - ...