您的位置:首页 > 其它

HDU 1548 A strange lift (Dijkstra)

2017-02-11 09:54 323 查看
https://vjudge.net/problem/HDU-1548

题意:

电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键。

思路:

可以用BFS,也可以用迪杰斯特拉算法。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

#define INF 100000000

int n, A, B;
int map[205][205];
int vis[205];
int d[205];
int num[205];

void Dijkstra()
{
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
{
num[i] = map[A][i];
}
num[A] = 0;
vis[A] = 1;
for (int i = 1; i < n; i++)
{
int min = INF;
int pos;
for (int j = 1; j <= n; j++)
{
if (num[j] < min && !vis[j])
{
pos = j;
min = num[j];
}
}
if (min == INF)    break;
vis[pos] = 1;
for (int j = 1; j <= n; j++)
{
if (num[pos] + map[pos][j] < num[j] && !vis[j])
num[j] = num[pos] + map[pos][j];
}
}
if (num[B] == INF)  printf("-1\n");
else printf("%d\n", num[B]);
}

int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int a;
while (scanf("%d", &n) && n)
{
scanf("%d%d", &A, &B);
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", &a);
if (i + a <= n)
map[i][i + a] = 1;
if (i - a >= 0)
map[i][i - a] = 1;
}
Dijkstra();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: