PTA_数据结构与算法题目集(中文)_7-8 哈利·波特的考试 (25 分)_Dijkstra算法和Floyd算法实现

  • 题目地址
  • 题目解析:非常典型的多源最短路径题目
  • 我的代码:

1、Dijkstra算法

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f

int n, m, aa[101][101];
void reader(void)
{
	scanf("%d %d", &n, &m);
	memset(aa, 0x3f, sizeof(aa));
	for (int i = 1; i <= n; i++)
		aa[i][i] = 0;

	for (int i = 0, a, b, c; i < m; i++)
	{
		scanf("%d %d %d", &a, &b, &c);
		aa[a][b] = c, aa[b][a] = c;
	}
	return;
}
int dijkstra(int s);

int main()
{
	reader();
	int minOfMax = INF, id = 0;
	for (int i = 1, val; i <= n; i++)
	{
		val = dijkstra(i);
		if (val < minOfMax)
			minOfMax = val, id = i;
	}
	if (id)	printf("%d %d", id, minOfMax);
	else	printf("%d", 0);

	return 0;
}
int dijkstra(int s)
{
	int dist[101], mark[101] = { 0 };
	for (int i = 1; i <= n; i++)
		dist[i] = aa[s][i];
	mark[s] = 1;

	int count = 1, max = 0;
	while (1)
	{
		int curMin = INF, curI = 0;
		for (int i = 1; i <= n; i++)
			if (!mark[i] && dist[i] < curMin)
				curMin = dist[i], curI = i;
		if (!curI) break;

		mark[curI] = 1, count++;
		for (int i = 1, val; i <= n; i++)
			if (!mark[i] && aa[curI][i] < INF)
			{
				val = dist[curI] + aa[curI][i];
				if (val < dist[i])
					dist[i] = val;
			}
		if (dist[curI] > max)
			max = dist[curI];
	}
	if (count == n && max != 0)
		return max;
	return INF;
}

2、Floyd算法

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define MIN(a,b) a<b?a:b;

int main()
{
	int n, m, aa[101][101];
	scanf("%d %d", &n, &m);
	memset(aa, 0x3f, sizeof(aa));
	for (int i = 1; i <= n; i++)
		aa[i][i] = 0;
	for (int i = 0, a, b, c; i < m; i++)
	{
		scanf("%d %d %d", &a, &b, &c);
		aa[a][b] = c, aa[b][a] = c;
	}

	int minOfMax = INF, id = 0;
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			if (k != n)
			{
				for (int j = 1; j <= n; j++)
					aa[i][j] = MIN(aa[i][j], aa[i][k] + aa[k][j]);
			}
			else
			{
				int flag = 0, max = 0;
				for (int j = 1; j <= n; j++)
				{
					aa[i][j] = MIN(aa[i][j], aa[i][k] + aa[k][j]);
					if (aa[i][j] > max)
						max = aa[i][j];
				}
				if (max < minOfMax && !flag)
					minOfMax = max, id = i;
			}
	if (id)	printf("%d %d", id, minOfMax);
	else	printf("%d", 0);

	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值