#include<iostream> #define MAX 0x7fffffff using namespace std; const int GoodsN=101; int M,N;//M为等级差,N为物品数目 int GoodsPerson[GoodsN][GoodsN]; int Rank[GoodsN]; int Price; int SubstituteN;//代替物品的总数 int Shortcut[GoodsN];//存放源点到任意点i的最短距离,这里是酋长祭司等人提出的最初价钱。 int Vist[GoodsN]; //初始化数据 void dataInit() { memset(GoodsPerson,0,sizeof(GoodsPerson)); memset(Rank,0,sizeof(Rank)); memset(Shortcut,MAX,sizeof(Shortcut)); memset(Vist,0,sizeof(Vist)); cin>>M>>N; for(int i=1;i<=N;i++) { cin>>Price>>Rank[i]>>SubstituteN; GoodsPerson[0][i]=Price;//酋长和祭司等人开始要求的价格 for(int j=1;j<=SubstituteN;j++) { int GoodsNum; cin>>GoodsNum>>Price; GoodsPerson[GoodsNum][i]=Price; } } } //Dijkstra算法 int dijkstra() { int NodeI;//寻找到的最优节点 int MinPriceT;//最小的价格 for(int i=1;i<=N;i++) Shortcut[i]=GoodsPerson[0][i]; for(int i=1;i<=N;i++) { NodeI=0; MinPriceT=MAX; for(int j=1;j<=N;j++) { if(!Vist[j]&&MinPriceT>Shortcut[j]) { MinPriceT=Shortcut[j]; NodeI=j; } } if(NodeI==0) break; Vist[NodeI]=1; for(int j=1;j<=N;j++) { if(!Vist[j]&&GoodsPerson[NodeI][j]>0&&Shortcut[j]>Shortcut[NodeI]+GoodsPerson[NodeI][j]) Shortcut[j]=Shortcut[NodeI]+GoodsPerson[NodeI][j]; } } return Shortcut[1]; } int main() { freopen("in.txt","r",stdin); dataInit(); int PriceRes; int MinPrice; MinPrice=MAX; for(int i=1;i<=N;i++) { int MaxRank=Rank[i]; for(int j=1;j<=N;j++) { if(Rank[j]>MaxRank||MaxRank-Rank[j]>M) Vist[j]=1; else Vist[j]=0; } PriceRes=dijkstra(); if(PriceRes<MinPrice) MinPrice=PriceRes; } cout<<MinPrice<<endl; return 0; }