ZOJ Problem Set - 1082 Stockbroker Grapevine

本文详细介绍了如何解决最短路径问题,通过实例演示使用二维数组存储边权重,并利用动态规划思想实现路径优化。

第一次做最短路径的题目。

大致是看别人的代码。不过多多少理解了。还要多多练习才行。

用过一个map二维数组来存储两点之间的权值。

首先输入人数个数num,然后在输入num行,第一行代表第一个人,第二行代表第二个人,每行第一个数位对数pair,然后分别输入pair对。例如:2 2 4 3 5 则表示有两对数据分别是2 4 和3 5  代表 第一个人传递到第二个人需要4个时间。第一个人传递给第三个人需要5个时间。对角为0,不能传到的为INT_MAX,即为最大值。需要include <limits.h>

用for循环将每个人(i)作为起点,然后算传播到每个人的时间,会得到一个dis[]数组,里面存有i号人传播到每个人的时间,求这时间的最大值,保存。然后求出循环n个人后这个时间最大值里面的最小值,如果有传播不到的,输出"  disjoint  "。否则输出从几号开始传播 以及最短传播到所有人的时间。

对于第一次做这种题目的我,感觉其中有包含着DP的思想。即每次都会更新两点之间的距离,dis[]。


#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <memory.h>
int main()
{
	int i, j, k, x, n, num, mmax, pair, max, number, now, flag, temp;
	int hash[1000], map[100][100], dis[1000];
	while (scanf("%d", &num) && num)
	{
		for (i = 1; i <= num; i++)
			for (j = 1; j <= num; j++)
				map[i][j] = INT_MAX;
		for (i = 1; i <= num; i++)
		{
			scanf("%d", &pair);
			for (j = 1; j <= pair; j++)
			{
				scanf("%d %d", &x, &n);
				map[i][x] = n;
			}
			map[i][i] = 0;
		}
		max = INT_MAX;
		for (i = 1; i <= num; i++)
		{
			memset(hash, 0, sizeof(hash));
			for (j = 1; j <= num; j++)
				dis[j] = INT_MAX;
			hash[i] = 1; now = i; dis[now] = 0; flag = 1;
			for (j = 1; j <= num; j++)
			{
				mmax = INT_MAX;
				for (k = 1; k <= num; k++)
					if (map[now][k] != INT_MAX && dis[k] > dis[now] + map[now][k])
						dis[k] = dis[now] + map[now][k];
				for (k = 1; k <= num; k++)
					if (!hash[k] && mmax > dis[k])
					{
						mmax = dis[k];
						now = k;
					}
				hash[now] = 1;
			}
			for (j = 1; j <= num && flag; j++)
				if (dis[j] == INT_MAX)
					flag = 0;
			temp = 0;
			if (flag)
			{
				for (j = 1; j <= num; j++)
				{
					if (dis[j] > temp)
						temp = dis[j];
				}
				if (temp < max)
				{
					max = temp;
					number = i;
				}
			}
		}
		if (max == INT_MAX)
			printf("  disjoint  \n");
		else
			printf("%d %d\n", number, max);
	}
	return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值