题解 CF1829E The Lakes

大家好,我是 CQ-C2024 蒟蒻 CJH。

题意

本题有多组数据。

求连通块最大权值和。

分析

对于每一个 $a_{i,j}>0$ 且未访问过的点进行 BFS,接着统计权值和取最大值即可。

注意事项

本题有多组数据!!!所以访问数组一定要清空!多测不清空,爆零两行泪。

代码

//the code is from chenjh
#include<cstdio>
#include<algorithm>
#include<queue>
#include<utility>
#define mp std::make_pair
typedef std::pair<int,int> PII;
int n,m;
int a[1001][1001];//水深。
bool b[1001][1001];//访问数组。
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//方向数组。
void solve(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]),b[i][j]=0;//记得清空访问数组!
    std::queue<PII> Q;
    int ans=0;
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
        int w=0;
        if(!a[i][j]||b[i][j]) continue;//保证当前位置非 0 且未访问。
        Q.push(mp(i,j));
        for(int x,y;!Q.empty();){
            x=Q.front().first,y=Q.front().second;Q.pop();
            if(b[x][y]) continue;//访问过则退出。
            b[x][y]=1;//标记访问数组。
            w+=a[x][y];//统计权值。
            for(int k=0,nx,ny;k<4;k++){
                nx=x+dx[k],ny=y+dy[k];
                if(nx>0&&nx<=n&&ny>0&&ny<=m&&a[nx][ny]) Q.push(mp(nx,ny));//符合范围则继续广搜。
            }
        }
        ans=std::max(ans,w);//更新答案。
    }
    printf("%d\n",ans);
}
int main(){
    int T;scanf("%d",&T);
    while(T--) solve();
    return 0;
}
posted @ 2023-05-07 20:52  Chen_Jinhui  阅读(7)  评论(0)    收藏  举报  来源