hdu 1548 A strange lift 最短路 spfa模板

来源:互联网 发布:linux下ant的安装配置 编辑:程序博客网 时间:2024/05/20 12:46

题意:一个电梯每层楼可以上ki层,或下ki层,若到达的层合法。求电梯从A层到B层的最少移动次数,若不能到达输出-1。

简单最短路径,每层与其能到的层连有向边,权值为1。建图后spfa模板即可。

#include <iostream>#include<cmath>#include<cstring>#include<cstdio>#define INF 0x7ffffff#define N 220using namespace std;int a[N][N],d[N],v[N],q[N],n,s,t;int spfa(int s,int t){    for(int i=1;i<=n;i++)        d[i]=INF,v[i]=0;    int cnt=0;    q[cnt++]=s;    v[s]=1;    d[s]=0;    while(cnt>0)    {        int c=q[--cnt];        v[c]=0;        for(int i=1;i<=n;i++)        {            if(a[c][i]==1&&d[i]>d[c]+a[c][i])            {                d[i]=d[c]+a[c][i];                if(!v[i])   v[i]=1,q[cnt++]=i;            }        }    }    if(d[t]==INF)   return -1;    return d[t];}int main(){    while(~scanf("%d",&n)&&n)    {        scanf("%d%d",&s,&t);        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)        {            int f;            scanf("%d",&f);            if(i-f>=1)  a[i][i-f]=1;            if(i+f<=n)  a[i][i+f]=1;        }        cout<<spfa(s,t)<<endl;    }}

0 0
原创粉丝点击