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