题意:中文题不解释...
思路:建图,每个物品看成一个点,酋长的允诺也看作一个物品, 如果一个物品加上金币可以交换另一个物品,则这两个点之间有边,权值为替代的金币数,求第一个点到所有点的最短路。
因为有等级限制,所以直接暴力枚举每个点作为最低等级的情况求一次最短路,然后取最小
trick:有一点需要注意:酋长的等级不一定是最高的
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 100000
#define LL long long
int cas=1,T;
const int INF = 0x7fffffff;
int M,N;
int price[101][101];
int lv[101];
int repla[101];
int d[101];
bool vis[101];
int dijkstra()
{
int u;
int sd;
for (int i = 1;i<=N;i++)
d[i] = price[0][i];
for (int i = 1;i<=N;i++)
{
u = 0;
sd = INF;
for (int j = 1;j<=N;j++)
{
if (!vis[j] && sd > d[j])
{
sd = d[j];
u=j;
}
}
// if (u==0)
// break;
vis[u]=1;
for (int j = 1;j<=N;j++)
{
if (!vis[j] && price[u][j]>0 && d[j] > d[u]+price[u][j])
d[j]=d[u]+price[u][j];
}
}
return d[1];
}
int main()
{
scanf("%d%d",&M,&N);
for (int i = 1;i<=N;i++)
d[i]=INF;
for (int i = 1;i<=N;i++)
{
scanf("%d%d%d",&price[0][i],&lv[i],&repla[i]); //price[0][i] 东西i无代替时价钱
for (int j = 1;j<=repla[i];j++)
{
int t,u; //替代品编号 优惠价
scanf("%d%d",&t,&u);
price[t][i]=u;
}
}
int ans;
int maxnlv;
int minprice = INF;
for (int i = 1;i<=N;i++)
{
maxnlv = lv[i];
for (int j = 1;j<=N;j++)
{
if (lv[j]>maxnlv || maxnlv-lv[j]>M)
vis[j]=1;
else
vis[j]=0;
}
ans = dijkstra();
minprice = min(minprice,ans);
}
printf("%d\n",minprice);
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}