比赛 EYOI与SBOI开学欢乐赛5th 评测结果 AAAAA
题目名称 最优连通子集 最终得分 100
用户昵称 ムラサメ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-09-16 22:00:11
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
struct node{
	int v,next;
}zry[2005];
int n,i,j,cnt,ans;
int x[1005],y[1005],head[1005],dp[1005];
inline int read()//快读
{
	int s=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		s=(s<<3)+(s<<1)+c-'0';
		c=getchar();
	}
	return s*f;
}
inline void build(int p,int q)
{
	cnt++;
	zry[cnt].v=q,zry[cnt].next=head[p];
	head[p]=cnt;
}
inline int js(int x,int fa)
{
	for(int i=head[x];i;i=zry[i].next)
	{
		if(zry[i].v!=fa)
		{
			js(zry[i].v,x);
			if(dp[zry[i].v]>0) dp[x]=dp[x]+dp[zry[i].v];//如果权和大于0则加上
		}
	}
}
signed main()
{
	freopen("subset.in","r",stdin);
	freopen("subset.out","w",stdout);
	n=read();
	cnt=0,ans=-998244353;
	memset(head,0,sizeof(head));
	for(i=1;i<=n;i++)
	{
		x[i]=read(),y[i]=read(),dp[i]=read();
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<i;j++)
		{
			if(abs(x[i]-x[j])+abs(y[i]-y[j])==1)//横纵坐标之差的和为一的两个点之间建边
			{
				build(i,j),build(j,i);//前向星建边
			}
		}
	}
	js(1,0);//树形DP
	for(i=1;i<=n;i++)
	{
		ans=max(ans,dp[i]);
	}
	printf("%d",ans);
	return 0;
}