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;
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9275954.html