比赛 EYOI与SBOI开学欢乐赛5th 评测结果 AAAAA
题目名称 最优连通子集 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.043 s
代码语言 C++ 内存使用 2.36 MiB
提交时间 2022-09-16 19:22:29
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1000+5;
struct sdf{
    int to,next;
    bool operator<(const sdf&x)const{
        if (to!=x.to)return to<x.to;
        return next<x.next;
    }
}eg[2*N];
int head[N]={0},ne=0;
int n,c[N],ans=0;
map<sdf,int>mp;
void add(int x,int y){
    eg[++ne]={y,head[x]};
    head[x]=ne;
    return ;
}
int dfs(int pt,int fa){
    int tmp=c[pt];
    for (int i=head[pt];i!=0;i=eg[i].next){
        int v=eg[i].to;
        if (v==fa)continue;
        tmp+=max(dfs(v,pt),0);
    }
    return tmp;
}
int main(){
    freopen ("subset.in","r",stdin);
    freopen ("subset.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        int x,y,t;
        scanf("%d%d%d",&x,&y,&c[i]);
        mp[{x,y}]=i;
        t=mp[{x,y-1}];
        if (t!=0){
            add(i,t),add(t,i);continue;
        }
        t=mp[{x-1,y}];
        if (t!=0){
            add(i,t),add(t,i);continue;
        }
        t=mp[{x,y+1}];
        if (t!=0){
            add(i,t),add(t,i);continue;
        }
        t=mp[{x+1,y}];
        if (t!=0){
            add(i,t),add(t,i);continue;
        }
    }
    for (int i=1;i<=n;i++)ans=max(ans,dfs(i,i));
    printf("%d\n",ans);
    return 0;
}