hdu 1548 简单 dijstra

来源:互联网 发布:linux kvm web控制面板 编辑:程序博客网 时间:2024/06/18 14:26
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int maxn=202;const int INF=1<<29;int n,st,ed,k[maxn],map[maxn][maxn],dis[maxn],vis[maxn];struct Node{    int v,next,w;    bool operator < (const Node &a) const    {        return w > a.w;    }} Edge[2000002],t1,t2;int dijstra(int  st,int ed){    priority_queue<Node>q;    for(int i=1; i<=n; i++)    {        dis[i]=INF;        if(map[st][i]<dis[i])        {            dis[i] = map[st][i];            t1.w = dis[i];            t1.v =  i;            q.push(t1);        }    }    dis[st]=0;//此句没加错了2次,囧~~~    vis[st] = 1;    while(!q.empty())    {        t1 = q.top();        q.pop();        int u = t1.v;        if(vis[u]) continue;        vis[u] = 1;        for(int v=1; v<=n; v++)        {            if(!vis[v])            {                if(dis[v]>dis[u]+map[u][v])                {                    dis[v] =dis[u]+map[u][v];                    t2.v = v;                    t2.w = dis[v];                    q.push(t2);                }            }        }    }    if(dis[ed]>=INF)return -1;    return dis[ed];}int main(){    while(scanf("%d",&n),n)    {        scanf("%d%d",&st,&ed);        int i,j;        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                map[i][j]=INF;            }            map[i][i]=0;        }        memset(vis,0,sizeof(vis));        for(i=1;i<=n;i++)        {            scanf("%d",&k[i]);            if(i-k[i]>=1)map[i][i-k[i]]=1;            if(i+k[i]<=n)map[i][i+k[i]]=1;        }        printf("%d\n",dijstra(st,ed));    }    return 0;}