rt,用的双端队列,但是是前向星存的图
估计有几个点TLE是因为建图效率较低
查了半天不明白到底为啥会出错
我的程序:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}
inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
inline void write(int x){if(x==0){putchar(48);return;}int len=0,dg[20];while(x>0){dg[++len]=x%10;x/=10;}for(register int i=len;i>=1;i--)putchar(dg[i]+48);}
int n,m;
struct node{
int to,next,val;
}edge[5000005];
int head[5000005],idx=0,dist[5000005];
deque<int> q;
string ch="\\";
char qwq;
void add(int u,int v,int w){
edge[++idx].to=v;
edge[idx].next=head[u];
edge[idx].val=w;
head[u]=idx;
return ;
}
void bfs(){
dist[1]=0;
q.push_front(1);
while(!q.empty()){
int x=q.front();
q.pop_front();
for(int i=head[x];i!=-1;i=edge[i].next){
int y=edge[i].to,dis=edge[i].val;
if(dist[y]>dist[x]+dis){
dist[y]=dist[x]+dis;
if(!dis)q.push_front(y);
else q.push_back(y);
}
}
}
return ;
}
int main(){
memset(head,-1,sizeof(head));
memset(dist,0x3f,sizeof(dist));
n=read(),m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>qwq;
if(qwq==ch[0]){
add(m*(i-1)+j,m*i+j+1,0);
add(m*i+j+1,m*(i-1)+j,0);
add(m*(i-1)+j+1,m*i+j,1);
add(m*i+j,m*(i-1)+j+1,1);
}
else if(qwq=='/'){
add(m*(i-1)+j,m*i+j+1,1);
add(m*i+j+1,m*(i-1)+j,1);
add(m*(i-1)+j+1,m*i+j,0);
add(m*i+j,m*(i-1)+j+1,0);
}
}
}
bfs();
// for(int i=1;i<=n*m+m;i++) cout<<dist[i]<<" ";
if(dist[n*m+m+1]>0x3f3f3f3f/2) cout<<"NO SOLUTION";
else cout<<dist[n*m+m+1];
return 0;
}
一组数据:
输入
3 5
/\/\/
//\/\
/\\\\
正确输出
3
错误输出
2