您的位置:首页 > 其它

acm-hdu1548解题报告

2015-08-01 20:30 387 查看
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1548

题目大意:电梯固定每次可上下层数,问最短路

解题思想:Dijkstra

代码:

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <algorithm>

using namespace std;

#define inf 0x7f7f7f

#define maxn 250

int dis[maxn],map[maxn][maxn],buttom[maxn];

int n;

bool vis[maxn];

void Dijkstra(int start,int finish)

{

    for(int i=1;i<=n;i++ )

    {

         vis[i]=false;

         dis[i]=map[start][i];

    }

    vis[start]=true;

    dis[start]=0;

    int temp,k;

    for(int i=1 ; i<=n ; i++ )

    {

         temp=inf;

         for( int j=1;j<=n;j++)

         {

              if(!vis[j]&&temp>dis[j])

                  temp = dis[k=j];

         }

         if(temp==inf)break;

         vis[k]=true;

         for(int j=1;j<=n;j++ )

              if(!vis[j]&&dis[j]>map[k][j]+dis[k])dis[j]=map[k][j]+dis[k];

    }

}

int main()

{

    int start,finish;

    while(scanf("%d",&n)&&n!=0)

    {

            scanf("%d%d",&start,&finish);

            for(int i=1;i<=n;i++ )

                for(int j=1;j<=n;j++ )

                     map[i][j]=inf;

            for(int i=1;i<=n;i++ )

            {

                scanf("%d",&buttom[i]);

                if(i+buttom[i]<=n)map[i][i+buttom[i]]=1;

                if(i-buttom[i]>=1)map[i][i-buttom[i]]=1;

            }

            Dijkstra(start,finish );

            if(dis[finish]==inf )printf("-1\n");

            else printf("%d\n",dis[finish]);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 算法 hdu