本来会是很水的题,但添了等级差这个东西,麻烦了点,还好数据量小,枚举完全能跑开,枚举每个下限,取最小的即可
#include<iostream>
using namespace std;
const int MAX=1000000000;
int cnt,limit;
int a[101][101];
int worth[101];
int level[101];
int dis[101];
int dijkstra(int v)
{
bool isin[101]={0};
int l=level[v];
for(int i=1; i<=cnt; i++)
{
if(level[i]-limit<=l&&level[i]>=l)
dis[i]=worth[i];
else
dis[i]=MAX;
}
while(1)
{
int min=MAX,k=-1;
for(int i=1;i<=cnt;i++)
{
if(isin[i]==0&&level[i]-limit<=l&&level[i]>=l&&dis[i]<min)
{
min=dis[i];
k=i;
}
}
if(k==-1)
break;
isin[k]=1;
for(int i=1;i<=cnt;i++)
{
if(isin[i]==0&&level[i]-limit<=l&&level[i]>=l&&dis[k]+a[k][i]<dis[i])
{
dis[i]=dis[k]+a[k][i];
}
}
}
return dis[1];
}
int main()
{
for(int i=0; i<101; i++)
for(int j=0; j<101; j++)
a[i][j]=MAX;
cin>>limit>>cnt;
int num;
for(int i=1; i<=cnt; i++)
{
cin>>worth[i]>>level[i]>>num;
while(num--)
{
int t,v;
cin>>t>>v;
a[t][i]=v;
}
}
int min=MAX;
for(int i=1; i<=cnt; i++)
{
int tmp=dijkstra(i);
if(tmp<min)
min=tmp;
}
cout<<min<<endl;
}