TOJ 2773. Fruit Trees 简单的BFS

这个题意就可以这样理解:就是求连通分量的最大值, 在图中,0代表边界;求块中的最大值: 

数据量100*100 ,可以直接考虑BFS , 时间还行:

/*
Accepted 2773 C++ 1.3K 0'00.14" 1392K
*/

#include <iostream>
#include <queue>
#include <stdio.h>
using namespace std;
int T,n,area[105][105],ma;
int di[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//四个方向
int bfs(int x,int y)
{
    queue<int > q;
    q.push(x*n+y);// 将二维压缩为1维 ,然后再转化
    int t=area[x][y];
    area[x][y]=-1;
    while(!q.empty())
    {
        int len=q.size();
        for(int i=0;i<len;i++)
        {
            int k=q.front();
            x=k/n;  y=k%n;//一维转换回二维坐标
            q.pop();
            for(int i=0;i<4;i++)
            {
                int xx=x+di[i][0],yy=y+di[i][1];
                if(xx>=0&&yy>=0&&xx<n&&yy<n&&area[xx][yy]>0)
                {
                    t+=area[xx][yy];
                    area[xx][yy]=-1;
                    q.push(xx*n+yy);
                }
            }
        }
    }
    return t;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&area[i][j]);
        ma=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                if(area[i][j]>0)
                {
                    int tmp=bfs(i,j);
                    if(tmp>ma) ma=tmp;
                }
            }
       printf("%d\n",ma);

    }


}


你可能感兴趣的:(bfs)