POJ 1062 昂贵的聘礼 最短路径 Dijkstra算法

                又是一道难得的中文题。

                思路: 利用Dijkstra算法, 求 最短路径;

                一开始 对 Dijkstra算法 理解不太到位,导致wa一次;

                然后 再做 仍然wa ,因为 自以为 酋长的等级一定是最高的 - -;

               对 等级范围 取值 枚举 ,重复求 最短路径, AC

              

#include <iostream>
using namespace std;
const int M = 101;
int dis[M],map[M][M],l[M],dist[M];
int n,m;
int Dijkstra(int Min, int Max)
{
	int count=0,i,f,mindis;
	bool flag[M] = {0};
	memcpy(dis, dist, sizeof(dis));
	for(i=0; i<n; i++)
		if(l[i]>Max || l[i]<Min) flag[i] = true;
	while(count<n)
	{
		for(i=0,mindis=99999999,f=0; i<n; i++)
		{
			if(mindis>dis[i]&&!flag[i])
			{
				mindis = dis[i];
				f = i;
			}
		}
		if(f==0) return dis[0];
		flag[f] = true; count++;
		for(i=0; i<n; i++)
		{
			if(dis[i] > map[i][f]+dis[f] && map[i][f]!=-1)
				dis[i] = map[i][f]+dis[f];
		}
	}
	return dis[0];
}
int main()
{
	int i,x,t,v;
	while(scanf("%d %d", &m, &n)!=EOF)
	{
		int ans = 9999999;
		memset(map, -1,sizeof(map));
		for(i=0; i<n; i++)
		{
			scanf("%d %d %d", &dist[i], &l[i], &x);
			while(x--)
			{
				scanf("%d %d", &t, &v);
				map[i][t-1]=v;
			}
		}
		for(i=l[0]-m; i<=l[0]; i++)
		{
			int t = Dijkstra(i, i+m);
			if(ans > t) ans = t;
		}
		printf("%d\n", ans);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值