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