比赛 EYOI与SBOI开学欢乐赛5th 评测结果 AAAAA
题目名称 最优连通子集 最终得分 100
用户昵称 该账号已注销 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-09-16 20:59:02
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct ab{
    int x,y,c;
}a[1010];
int n,mp[2010][2010],ans=-0x3f3f3f3f;
bool v[2010][2010]={0},v2[2010][2010]={0};
int dx[5]={0,1,0,-1,0},dy[5]={0,0,1,0,-1};
int bfs(int sx,int sy){
    int u=0;bool k;
    deque<pair<int,int> >q;
    q.push_front(make_pair(sx,sy));
    v[sx][sy]=1;
    while(!q.empty()){
        int x=q.front().first,y=q.front().second;q.pop_front();
        u+=mp[x][y]-100;
        if(mp[x][y]<100)k=1;
        if(k==0)v2[x][y]=1;
        ans=max(ans,u);
        for(int i=1;i<=4;i++){
            int nx=x+dx[i],ny=y+dy[i];
            if(mp[nx][ny]==0||nx<0||nx>2000||ny<0||ny>2000)continue;
            if(v[nx][ny]==1)continue;
            v[nx][ny]=1;
            if(mp[nx][ny]<100){
                q.push_back(make_pair(nx,ny));
                v[nx][ny]=1;
            }
            else q.push_front(make_pair(nx,ny)),v[nx][ny]=1;
        }
    }
    return 0;
}
int main(){
    freopen("subset.in","r",stdin);
    freopen("subset.out","w",stdout);
    cin>>n;
    if(n==2){
        int x1,y1,c1,x2,y2,c2;
        cin>>x1>>y1>>c1>>x2>>y2>>c2;
        if(abs(x1-x2)+abs(y1-y2)==1){
            ans=max(ans,c1+c2);
        }
        ans=max(ans,max(c1,c2));
        cout<<ans<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++){
        int x,y,c;
        cin>>x>>y>>c;
        if(x<-1000||x>1000||y<-1000||y>1000)continue;
        x+=1000;y+=1000;
        a[i].x=x,a[i].y=y,a[i].c=c+100;
        mp[x][y]=c+100;
    }
    for(int i=1;i<=n;i++){
        if(a[i].c<100)continue;
        if(v2[a[i].x][a[i].y]==0)bfs(a[i].x,a[i].y);
    }
    cout<<ans<<endl;
    return 0;
}