题目传送门
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define inf 0x3fffffff
int maze[110][110];
int dis[110],degree[110],val[110],vis[110];
int m,n;
void init()
{
memset(dis,inf,sizeof(dis));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
maze[i][j]=inf;
}
int dij()
{
for(int i=1;i<=n;i++)
dis[i]=val[i];
for(int i=1;i<=n;i++)
{
int minn=inf,mark=inf;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
mark=j;
}
}
if(minn==inf)break;
vis[mark]=true;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[mark]+maze[mark][j])
{
dis[j]=dis[mark]+maze[mark][j];
}
}
}
return dis[1];
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
init();
int x,a,b,tmp;
int ans=inf;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&val[i],°ree[i],&x);
while(x--)
{
scanf("%d%d",&a,&b);
maze[a][i]=b;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(degree[j]>=degree[i]&°ree[j]<=degree[i]+m)
{
vis[j]=false;
}
else
{
vis[j]=true;
}
}
tmp=dij();
ans=min(ans,tmp);
}
cout<<ans<<endl;
}
return 0;
}