比赛 |
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;
}