求助 bfs为什么会MLE

P8662 [蓝桥杯 2018 省 AB] 全球变暖

BoBolilla @ 2023-08-26 16:09:20

#include<iostream>
#include <cmath>
#include <algorithm>
#include <stack>
#include<vector>
#include<queue>
#include <cstring>
#include <iomanip>
#define endl "\n"
//#define LL long long
#define int long long
#define PII pair<int,int>
using namespace std;
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};

const int N = 1010;
char g[N][N];
bool vis[N][N],flag;
int n;

void bfs(int x,int y)
{

    queue<PII>q;
    q.push({x,y});
    while(q.size())
    {
        auto t=q.front();q.pop();
        int tx=t.first;int ty=t.second;
        vis[tx][ty]=1;
         if(g[tx-1][ty]=='#'&&g[tx+1][ty]=='#'&&g[tx][ty-1]=='#'&&g[tx][ty+1]=='#') flag = 1;
    for(int i=0;i<4;i++)
    {
       int  xx=tx+dx[i],yy=ty+dy[i];
        if(g[xx][yy]=='#'&&!vis[xx][yy])
        {
            q.push({xx,yy});
        }
    }
    }
}

signed main() {
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin >> n;
    for(int i=0;i<n;i++) cin >> g[i];

    int ans=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(g[i][j]=='#'&&!vis[i][j])
            {
                flag=0;
                bfs(i,j);
                if(!flag) ans++;
            }
        }
    }
    cout << ans;
    return 0;
}

不开O2tle,开O2mle 只有36分


by Lv_Boxiu @ 2023-08-26 16:36:24

N≤1000;

N*N=1000000;

考虑极端情况

TLE:

考虑极端情况

共遍历1000000-3996次;

每次至少26个命令;

考虑到向外遍历;

平均100余条;

洛谷机子一秒1亿次;

MLE:

考虑极端情况

共498002次

共498002个队列、 498002个auto、 2988012个int。

不超才怪


by Lv_Boxiu @ 2023-08-26 16:36:52

@BoBolilla


by zhangshuhang2011 @ 2023-08-26 16:37:10

估计是出队的速度没有入队的快,然后队列MLE了


by BoBolilla @ 2023-08-28 17:42:07

@Lv_Boxiu 好滴我还是用DFS吧,,,


|