SPFA求助,RE8个,WA2个

P1746 离开中山路

Vicssia @ 2019-07-11 11:44:43

#include<bits/stdc++.h>
using namespace std;

int n,tot=0;
int ha,la,hb,lb;
int mg[1005][1005];
int head[1000005],dis[1000005],vis[1000005];
struct pp
{
    int v,w,nxt;
}e[2000005];
deque <int> q;

int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

void in()
{
    memset(head,-1,sizeof(head));
    cin>>n;
    char c;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        {
            cin>>c;
            if(c=='0')
            mg[i][j]=1;
            if(c=='1')
            mg[i][j]=-1;
        }
    }
    cin>>ha>>la>>hb>>lb;
}

void spfa(int s)
{
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[s]=0;
    vis[s]=1;
    q.push_back(s);
    while(!q.empty())
    {
        int u=q.front();q.pop_front();vis[u]=0;
        for(int i=head[u];i!=-1;i=e[i].nxt)
        {
            int p=e[i].v;
            if(dis[p]>dis[u]+e[i].w)
            {
                dis[p]=dis[u]+e[i].w;
                if(!vis[p])
                {
                    vis[p]=1;
                    if(q.empty()||dis[p]>dis[q.front()])
                    q.push_back(p);
                    else
                    q.push_front(p);
                }
            }
        }
    }
}

void add(int u,int v,int w)
{
    e[tot].v=v;
    e[tot].w=w;
    e[tot].nxt=head[u];
    head[u]=tot++;
}

void work()
{
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        {
            if(mg[i][j]==1)
            {
                if(mg[i][j+1]==1)
                {
                    add((i-1)*n+j,(i-1)*n+j+1,1);
                }
                if(mg[i][j-1]==1)
                {
                    add((i-1)*n+j,(i-1)*n+j-1,1);
                }
                if(mg[i+1][j]==1)
                {
                    add((i-1)*n+j,i*n+j,1);
                }
                if(mg[i-1][j]==1)
                {
                    add((i-1)*n+j,(i-2)*n+j,1);
                }
            }
        }
    }
    spfa((ha-1)*3+la);
    printf("%d",dis[(hb-1)*3+lb]);
}

int main()
{
    in();
    work(); 
    return 0;
}

by loris @ 2019-10-20 13:20:11

你的长度。。。。。。


|