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