昂贵的聘礼(最短路,建立超级源点)

在这里插入图片描述
在这里插入图片描述

思路:我们建立一个超级源点,源点到每个物品的价值代表直接购买,然后根据兑换方式进行建图,为了保证在等级限制内,并且我们必定要换到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;

}

猜你喜欢

转载自blog.csdn.net/qq_43619680/article/details/109559451