这是现在的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=250010;
int h[N],e[N],w[N],ne[N],idx,n,m,dist[N];bool st[N];
typedef pair<int,int> PII;
void add(int a,int b,int c){
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dijstra(){
priority_queue<PII,vector<PII>,greater<PII> > heap;
memset(dist,0x3f,sizeof dist);
dist[0]=0;
heap.push({0,0});
while(heap.size()){
PII t=heap.top();
int v=t.second,d=t.first;
heap.pop();
if(st[v])continue;
st[v]=1;
for(int i=h[v];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>d+w[i]){
dist[j]=d+w[i];
heap.push({dist[j],j});
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
memset(h,-1,sizeof h);
if((n+m)%2==0){
cout<<"NO SOLUTION";
return 0;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
char c;
cin>>c;
if(c=='/')
if((i+j)%2==0) add(i*m+j,i*(m+1)+j+1,0),add(i*(m+1)+j+1,i*m+j,0);
else add(i*m+j,i*(m+1)+j+1,1),add(i*(m+1)+j+1,i*m+j,1);
else
if((i+j)%2==0) add(i*m+j+1,i*(m+1)+j,1),add(i*(m+1)+j,i*m+j+1,1);
else add(i*m+j+1,i*(m+1)+j,0),add(i*(m+1)+j,i*m+j+1,0);
}
}
dijstra();
cout<<dist[n];
}
我用的是dijstra堆优化+邻接表