poj1062

就是对迪杰斯特拉算法的应用,不同的人代表不同的节点,旅行者作为起点 与其他点之间的权值就是直接购买货物的价格,其他两点之间的权值就是除了换物品外还要加的价格,其中要注意一点,就是这里有等级限制,所以并不是可以把所有点加进去。这里可以用枚举的思路。

#include<iostream>
using namespace std;
const int MAX = 0x7ffffff;
const int MAXN = 105;
int lv[MAXN];
int dis[MAXN];
int trade[MAXN][MAXN];
void init(int M,int N)
{
	for(int i=0;i!=MAXN;i++)
		for(int j=0;j!=MAXN;j++)
			trade[i][j] = MAX;
	for(int i=1;i!=N+1;i++)
	{
		int money,level,amount;
		cin>>money>>level>>amount;
		dis[i] = money;lv[i] = level;
		trade[0][i] = money;
		while(amount--)
		{
			int vetex;int mon;
			cin>>vetex>>mon;
			trade[vetex][i] = mon;
		}
	}
	dis[0] = 0;
}
int dijkstra(int min,int max,int N)
{
	for(int k = N;k!=-1;k--)
		{
			if(lv[k]<min||lv[k]>max)
			{
				if(k!=0)
					continue;
			}
			for(int i = N;i!=-1;i--)
			{
				if(lv[i]<min||lv[i]>max)
				{
					if(i!=0)
						continue;
				}
				if(dis[i]>dis[k]+trade[k][i])
					dis[i] = dis[k]+trade[k][i];
			}
		}
	return dis[N];
}
int main()
{
	int M,N;
	cin>>M>>N;
	int buff = MAX;
	init(M,N);
	int L = lv[1];L-=M;
	while(L<=lv[1])
	{
		if(buff>dijkstra(L,L+M,N))
			buff = dis[1];
		L++;
	}
	cout<<buff<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值