题目链接: POJ - 1062  昂贵的聘礼 

要注意等级限制所以枚举可行的等级

 

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<math.h>
using namespace std;
#define maxn 1000
#define inf 0x3f3f3f3f
struct ac{
  int va,lv;
  ac(){}
  ac(int b,int c){
    va=b,lv=c;
  }
}a[maxn];
struct wa{
  int to,va;
  wa(){}
  wa(int a,int b){
     to=a,va=b;
  }
};
vector<wa>q[maxn];
int n,m;
int dis[maxn],levl[maxn];
bool fa[maxn],ffa[maxn];int spfa(int l,int r){
   memset(fa,0,sizeof(fa));
   memset(dis,inf,sizeof(dis));
   queue<int>qq;
   dis[1]=0;
   levl[1]=a[1].lv;
   qq.push(1);
   while(!qq.empty()){
      int u=qq.front();
      qq.pop();
      fa[u]=0;
      for(int j=0;j<q[u].size();j++){
         wa x=q[u][j];
         int i=a[x.to].lv;
         int ii=a[u].lv;
         int v=x.to;
         int va=x.va;
         if(i>=l&&i<=r){
            if(dis[v]>dis[u]+va){
               dis[v]=dis[u]+va;
               if(!fa[v]){
                 fa[v]=1;
                 qq.push(v);
               }
            }
         }

      }
   }
   int ans=inf;
   for(int j=1;j<=m;j++){
      ans=min(dis[j]+a[j].va,ans);
   }
   return ans;
}
int main(){
   cin>>n>>m;
   for(int j=1;j<=m;j++){
      int va,lv,t;
      cin>>va>>lv>>t;
      a[j]=ac(va,lv);
      for(int k=0;k<t;k++){
         int a,b;
         cin>>a>>b;
         q[j].push_back(wa(a,b));
      }
   }
   int ans=inf;
   for(int j=a[1].lv-n;j<=a[1].lv;j++){
       ans=min(ans,spfa(j,j+n));
   }
   cout<<ans<<endl;
}
/*

1 4
10000 3 2
2 1
3 3
1000 2 2
4 1
3 1
1000 3 1
4 2
100 4 0


105
*/