CodeForces 37E Trial for Chief

rainbowcat的题解,然后AK爷按这个写挂了(AK爷怎么可能写挂,肯定是题解的问题)
cf的毒瘤数据卡了lyd的说法,一个全是W的图。

那么我们应该让最后求得时候

if(c[i][j]=='B') ans=max(ans,dis[(i-1)*m+j]+1);
else ans=max(ans,dis[(i-1)*m+j]);

这样就输出\(min(ans)\)即可AC

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0};
int n,m,ans=0x3f3f3f3f,dis[55*55];
bool vis[55*55];
char c[55][55];
vector<int>G[55*55],V[55*55];
queue<int>q;
int spfa(int x) {
    memset(dis,0x3f,sizeof dis);
    memset(vis,0,sizeof vis);
    dis[x]=0;
    q.push(x);
    vis[x]=1;
    while(!q.empty()) {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=0; i<G[u].size(); i++) {
            if(dis[G[u][i]]>dis[u]+V[u][i]) {
                dis[G[u][i]]=dis[u]+V[u][i];
                if(!vis[G[u][i]]) vis[G[u][i]]=1,q.push(G[u][i]);
            }
        }
    }
    int ans=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            if(c[i][j]=='B') ans=max(ans,dis[(i-1)*m+j]+1);
            else ans=max(ans,dis[(i-1)*m+j]);
    return ans;
}
int main() {
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>c[i][j];
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            for(int k=0; k<4; k++) {
                int nx=dx[k]+i,ny=dy[k]+j;
                if(nx>0&&nx<=n&&ny>0&&ny<=m) {
                    if(c[i][j]==c[nx][ny])
                        G[(i-1)*m+j].push_back((nx-1)*m+ny),V[(i-1)*m+j].push_back(0);
                    else G[(i-1)*m+j].push_back((nx-1)*m+ny),V[(i-1)*m+j].push_back(1);
                }
            }
        }
    }
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            ans=min(ans,spfa((i-1)*m+j));
        }
    }
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9275954.html