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;
}


你可能感兴趣的:(poj1062)