我用迪杰斯特拉做的,就一个点多了6ms,求优化
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
const int MAXNUM=1004005;
struct inin
{
int to;
int next;
int num;
}mp[MAXNUM];
int tot=0;
int head[MAXNUM],dis[MAXNUM];
bool vis[MAXNUM];
inline void NEW(int from,int to,int num)
{
// cout<<from<<' '<<to<<' '<<num<<endl;
tot++;
mp[tot].num=num;//dis
mp[tot].to=to;
mp[tot].next=head[from];
head[from]=tot;
}
struct node
{
int dis;
int pos;
bool operator < (const node &x)const
{
return x.dis<dis;
}
};
priority_queue<node> Q;
inline void djstl()
{
dis[s]=0;
Q.push((node){0,s});
while(!Q.empty())
{
node TOP=Q.top();
Q.pop();
int first=TOP.pos,second=TOP.dis;
if(vis[first]==true)
{
continue;
}
vis[first]=true;
for(register int i=head[first];i;i=mp[i].next)
{
int TOT=mp[i].to;
if(dis[TOT]>dis[first]+mp[i].num)
{
dis[TOT]=dis[first]+mp[i].num;
if(vis[TOT]==false)
{
Q.push((node){dis[TOT],TOT});
}
}
}
}
}
/*
3 3
\/\
//\
\\\
*/
int main()
{
int x,y;
//cin>>n>>m>>s;
s=1;
scanf("%d%d",&x,&y);
if(abs(x-y)%2==1)
{
printf("NO SOLUTION");
return 0;
}
getchar();
n=(x+1)*(y+1);
m=x*y*4;
for(register int i = 1; i <= n; ++i)dis[i] = 0x7fffffff;
for(register int i=1;i<=x;i++)
{
for(register int j=1;j<=y;j++)
{
int a,b,c;
char a12=getchar();
if(a12=='\\')
{
a=(i-1)*(y+1)+j;
b=i*(y+1)+j+1;
c=0;
NEW(a,b,c);
NEW(b,a,c);
a++,b--,c=1;
NEW(a,b,c);
NEW(b,a,c);
}
if(a12=='/')
{
a=(i-1)*(y+1)+j+1;
b=i*(y+1)+j;
c=0;
NEW(a,b,c);
NEW(b,a,c);
a--,b++,c++;
NEW(a,b,c);
NEW(b,a,c);
}
}
getchar();
}
djstl();
printf("%d",dis[n]);
return 0;
}