传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2346
对角线建边,原来有的权为0没有的权为1,跑最短路,
堆dijk,我的最爱~~~~~~~~spfa去死吧!!!!
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=510*510+510;
struct edge{int u,v,w;};
vector<edge>G[maxn];
void add(int u,int v,int w){
G[u].push_back((edge){u,v,w});
G[v].push_back((edge){v,u,w});
}
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> >q;
int d[maxn],vis[maxn];
int s,t,n,m;
void dijk(){
fill(d+1,d+1+t,INT_MAX>>1);
q.push(pii(d[s],s));
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])continue;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].v,w=G[u][i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push(pii(d[v],v));
}
}
vis[u]=1;
}
if(d[t]==INT_MAX/2)puts("NO SOLUTION");
else printf("%d\n",d[t]);
}
void deb(){
for(int i=0;i<=n*(m-1);i++)
for(int j=0;j<G[i].size();j++)
printf("%d -> %d w:%d\n",G[i][j].u,G[i][j].v,G[i][j].w);
}
int main(){
scanf("%d%d",&n,&m);
s=0;t=n*(m+1)+m;m++;
for(int i=1;i<=n;i++){
char str[510];
scanf("%s",str+1);
for(int j=1;j<m;j++)
if(str[j]=='/'){
add((i-1)*m+j,i*m+j-1,0);
add((i-1)*m+j-1,i*m+j,1);
}else{
add((i-1)*m+j,i*m+j-1,1);
add((i-1)*m+j-1,i*m+j,0);
}
}//deb();
dijk();
return 0;
}