HDU-1548 A strange lift(最短路[Spfa || BFS])
阿新 • • 發佈:2018-11-27
題目連結:
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; }