吸氧 88pts,求苣佬调。
#pragma gcc optimize(2)
#include <iostream>
#include <algorithm>
#include <queue>
#define maxn 1500010
#define inf 2147483647
using namespace std;
int n,m,s=1;
int head[maxn],to[maxn],nxt[maxn],cnt,dis[maxn];
short val[maxn];
bool vis[maxn];
void addage(int u,int v,int w){
to[++cnt]=v;
val[cnt]=w;
nxt[cnt]=head[u];
head[u]=cnt;
}
void add(int u,int v,int w){
addage(u,v,w);
addage(v,u,w);
}
queue<int> qwq;
void spfa(){
for(int i=1;i<=(n+1)*(m+1);i++){
vis[i]=0;
dis[i]=inf;
}
dis[s]=0;
vis[s]=1;
qwq.push(s);
while(!qwq.empty()){
int u=qwq.front();
qwq.pop();
vis[u]=0;
for(int i=head[u];i;i=nxt[i]){
if(dis[to[i]]>dis[u]+val[i]){
dis[to[i]]=dis[u]+val[i];
if(!vis[to[i]]){
qwq.push(to[i]);
vis[to[i]]=1;
}
}
}
}
}
inline int read(){
int x=0,f; char ch=0;
while(!isdigit(ch)) f=(ch=='-'?-1:1),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
inline void print(int x){
if(x<0) x=-x,putchar('-');
if(x>9) print(x/10);
putchar(x%10+48);
}
inline void write(int x){print(x);putchar('\n');}
signed main(){
n=read(),m=read();
if((n+m)%2==1){
cout<<"NO SOLUTION"<<endl;
exit(0);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char v;
cin>>v;
if(v=='/'){
add(((i-1)*(m+1)+j+1),(i*(m+1)+j),0);
add(((i-1)*(m+1)+j),(i*(m+1)+j+1),1);
}else{
add(((i-1)*(m+1)+j+1),(i*(m+1)+j),1);
add(((i-1)*(m+1)+j),(i*(m+1)+j+1),0);
}
}
}
spfa();
write(dis[(n+1)*(m+1)]);
return 0;
}