#B. 部落联盟

一,题目

Description

在草原上有N个部落,每个部落都有其坐标(xi,yi)

每个部落都有个武力值可正可负

由于部落间只能通过马匹来传递信息

于是只有当两个部落间的距离为1的时候,两个部落才有可能进行联系,距离计算公式为

abs(xi-xj)+abs(yi-yj)

现在希望从N个部落中选出一些部落来,满足下面两个条件

1:它们是连通

2:它们的武力值加起来最大化

Format

Input

第1行是一个整数N(2 <= N <= 1000),表示部落的个数

以下N行中,第i行(1 <= i <= N)有三个整数,Xi, Yi, Ci依次表示第i部落的坐标与武力值

-10^6 <= Xi, Yi <= 10^6,-100 <= Ci <= 100。

Output

如题

Samples

输入数据 1

5

0 0 -2

0 1 1

1 0 1

0 -1 1

-1 0 1

输出数据 1

2

Hint

将给出的5个点全部选中


二,思路

我们来模拟一下我自己造的一个样例(横向为x,竖向为y,方框内的数字为(x,y)的武力值,圈起来的数字为节点编号):

step 1.连树的边

因为在这里只有当两个部落间的距离为1的时候,两个部落才有可能进行联系,所以联系可以看成将2个节点进行连边。那么具体做法就是暴力枚举i和j,判断第i个节点离第j个节点的距离是否等于1,等于1则对i,j进行连一条边权为1的边。

具体代码:

那么根据上述思路对前面造的样例进行操作的树如下(彩虹色标记的是第i个节点的武力值):

然后就要进行一波玄学般的dfs操作了。

step 2.dfs

首先我们在结构体中再加一个变量z储存以i为根的子树中选出满足题目要求的一些部落武力值之和

dfs的过程:首先将bll[beg].z初始化成他本身的武力值(因为在以beg为根的这棵子树自己一定会被选),然后将beg的vis标记成1表示已经遍历过beg了。然后遍历beg的子节点,并去重(自己已经经过了的点不需要再遍历),然后判断如果此时正在遍历的子节点z的值是正数接受该子树所选部落的最大武力值之和,将 bll[beg].z += bll[v].z,即可。

step 3.输出答案

最后的答案其实就是这n个节点的z的最大值


三,整体代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值