1. 程式人生 > >HDU-1548 A strange lift(最短路[Spfa || BFS])

HDU-1548 A strange lift(最短路[Spfa || BFS])

題目連結:

http://acm.hdu.edu.cn/showproblem.php?pid=1548

參考部落格:

https://blog.csdn.net/idealism_xxm/article/details/47625691

BFS:

//BFS
#include <cstdio>
#include <cstring>
#include <queue>
 
using namespace std;
 
struct Node {
    int num,step;
    Node(int nn=0,int ss=0) {
        num=nn,step=ss;
    }
}u;
const int INF=0x3f3f3f3f;
int k[205];
int i,n,s,e,t,ans;
bool vis[205];
 
void BFS() {
    queue<Node> q;
    q.push(Node(s,0));
    vis[s]=true;
    while(!q.empty()) {
        u=q.front();
        if(u.num==e) {
            ans=u.step;
            return ;
        }
        q.pop();
        if((t=u.num+k[u.num])<=n&&!vis[t]) {
            vis[t]=true;
            q.push(Node(t,u.step+1));
        }
        if((t=u.num-k[u.num])>0&&!vis[t]) {
            vis[t]=true;
            q.push(Node(t,u.step+1));
        }
    }
}
 
int main() {
    while(scanf("%d",&n),n) {
        scanf("%d%d",&s,&e);
        for(i=1;i<=n;++i)
            scanf("%d",k+i);
        memset(vis,false,sizeof(vis));
        ans=INF;
        BFS();
        printf("%d\n",ans==INF?-1:ans);
    }
    return 0;
}

spfa:

#include <cstdio>
#include <cstring>
#include <queue>
 
using namespace std;
 
const int INF=0x3f3f3f3f;
int k[205],w[205][205],dis[205];
int i,n,s,e,t,u,tmp;
bool vis[205];
 
void Spfa() {
    queue<int> q;
    q.push(s);
    dis[s]=0;
    vis[s]=true;
    while(!q.empty()) {
        u=q.front();
        q.pop();
        vis[u]=false;
        for(i=1;i<=n;++i)
            if((tmp=dis[u]+w[u][i])<dis[i]&&!vis[i]) {
                dis[i]=tmp;
                vis[i]=true;
                q.push(i);
            }
    }
}
 
int main() {
    while(scanf("%d",&n),n) {
        scanf("%d%d",&s,&e);
        for(i=1;i<=n;++i) {
            scanf("%d",k+i);
            vis[i]=false;
            dis[i]=INF;
        }
        memset(w,0x3f,sizeof(w));
        for(i=1;i<=n;++i) {
            if((tmp=i+k[i])<=n)
                w[i][tmp]=1;
            if(0<(tmp=i-k[i]))
                w[i][tmp]=1;
        }
        Spfa();
        printf("%d\n",dis[e]==INF?-1:dis[e]);
    }
    return 0;
}