HDU1548【Dijkstra和BFS】

本文通过一个楼层移动问题,介绍了两种路径寻找算法的实现:广度优先搜索(BFS)和Dijkstra算法。BFS算法适用于解决简单的无权图最短路径问题,而Dijkstra算法则用于带权图的最短路径问题。两者均使用队列进行节点的存储与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1548

【广搜BFS分析】有N层楼,每层只能上或者下Ni阶,但是不能低于一层或高于N层,所以,每一次往两个方向搜索。

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;


int step[205];
int vis[205];
int a[205];
int main()
{
	int n;
	while (scanf("%d", &n) && n)
	{
		int s, e;
		scanf("%d%d", &s, &e);
		memset(vis, 0, sizeof(vis));
		memset(step, 0, sizeof(step));
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);
		queue<int>q;
		vis[s] = 1;
		step[s] = 0;
		q.push(s);
		int flag = 0;
		while (!q.empty())
		{
			int temp = q.front();
			q.pop();
			if (temp == e)
			{
				printf("%d\n", step[temp]);
				flag = 1;
				break;
			}
		
			for (int i = 0; i < 2; i++)
			{
				int next;
				if (i == 0)
					next = temp + a[temp];
				else
					next = temp - a[temp];
				if (next<1 || next>n)
					continue;
				if (!vis[next])
				{
					q.push(next);
					step[next] = step[temp]+1;
					vis[next] = 1;
				}
			}
		}
		if (flag == 0)
			printf("-1\n");
	}
	return 0;
}

【Dijkstra分析】用二维数组,从储存图,把 i 到 j 的点map[i][j]记为1,因为直接步数为1。

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int map[205][205];
int dist[205];
int s[205];
int a[205];
int n;//层数
int ss, ee;//起点和终点
const int M = 0x3f3f3f3f;
void Dijkstra();
int main()
{
	while (scanf("%d", &n) && n)
	{
		scanf("%d%d", &ss, &ee);
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= n; j++)
			{
				if (i != j)
					map[i][j] = M;
				else
					map[i][j] = 0;
			}
		}
		for (int i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
			if (i + a[i] <= n)
				map[i][i + a[i]] = 1;
			if (i - a[i] > 0)
				map[i][i - a[i]] = 1;
		}
		Dijkstra();
	}

	return 0;
}
void Dijkstra()
{
	for (int i = 1; i <= n; i++)
	{
		s[i] = 0;
		dist[i] = map[ss][i];
	}
	dist[ss] = 0;
	s[ss] = 1;
	for (int i = 1; i <= n - 1; i++)
	{
		int min = M;
		int k = ss;
		for (int j = 1; j <= n; j++)
		{
			if (!s[j] && dist[j] < min)
			{
				min = dist[j];
				k = j;
			}
		}
		s[k] = 1;
		for (int j = 1; j <= n; j++)
		{
			if (!s[j] && map[k][j]<M && dist[j]>dist[k] + map[k][j])
				dist[j] = dist[k] + map[k][j];
		}
	}
	if (dist[ee] != M)
		printf("%d\n", dist[ee]);
	else
		printf("-1\n");
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值