思路:我们建立一个超级源点,源点到每个物品的价值代表直接购买,然后根据兑换方式进行建图,为了保证在等级限制内,并且我们必定要换到1号物品,所以就枚举从1号物品等级-m——1号物品的等级区间跑最短路
#include<bits/stdc++.h>
#define re register
using namespace std;
typedef long long ll;
const double eps=1e-7;
const int INF=1e9;
const int N=105;
int n,m;
int x,y;
int cnt;
int tot;
int a,c;
int dis[N];
bool vis[N];
int level[N];
int mp[N][N];
int dij(int l,int r)
{
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
dis[0]=0;
// vis[0]=1;
for(int i=1;i<=n+1;i++)
{
int t=-1;
for(int j=0;j<=n;j++)
if(!vis[j]&&(t==-1||dis[t]>dis[j])) t=j;
vis[t]=1;
for(int j=1;j<=n;j++)
if(level[j]>=l&&level[j]<=r)
dis[j]=min(dis[j],dis[t]+mp[t][j]);
}
return dis[1];
}
int main()
{
memset(mp,0x3f,sizeof mp);
cin>>m>>n;
for(int i=1;i<=n;i++)
{
int val,cnt;
cin>>val>>level[i]>>cnt;
mp[0][i]=min(mp[0][i],val);
for(int j=1;j<=cnt;j++)
{
int id,w;
cin>>id>>w;
mp[id][i]=min(mp[id][i],w);
}
}
int ans=INF;
for(int i=level[1]-m;i<=level[1];i++) ans=min(ans,dij( i, i+m));
cout<<ans;
return 0;
}