中文题面...不多说...
能优惠的建边...按照等级枚举一下...求最小就好了..不多说..写这题的时候犯了几次SB错误...改了好久
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;
#define inf 1<<30
int map[120][120],used[120],dis[120];
int n,m;
struct node
{
int p,l,x;
int t[100];
int v[100];
}s[120];
int dijkstra(int x)
{
for(int i=0;i<=n;i++)
dis[i]=inf;
for(int i=1;i<=n;i++)
{
if(s[i].l-s[x].l<=m&&s[i].l>=s[x].l)
dis[i]=map[0][i];
}
dis[0]=0;
memset(used,0,sizeof(used));
used[0]=1;
for(int i=0;i<n;i++)
{
int mini=inf,t=-1;
for(int j=0;j<=n;j++)
{
if(!used[j]&&dis[j]<mini)
mini=dis[t=j];
}
if(mini==inf)
break;
used[t]=1;
for(int j=0;j<=n;j++)
{
if(s[j].l-s[x].l<=m&&s[j].l>=s[x].l)
if(!used[j]&&dis[j]>dis[t]+map[t][j])
dis[j]=dis[t]+map[t][j];
}
}
return dis[1];
}
int main()
{
while(cin>>m>>n)
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
map[i][j]=inf;
}
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&s[i].p,&s[i].l,&s[i].x);
for(int j=1;j<=s[i].x;j++)
{
scanf("%d %d",&s[i].t[j],&s[i].v[j]);
}
map[0][i]=s[i].p;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=s[i].x;j++)
if((abs(s[i].l-s[s[i].t[j]].l)<=m)&&(map[s[i].t[j]][i]>s[i].v[j]))
map[s[i].t[j]][i]=s[i].v[j];
}
int ans=inf;
for(int i=1;i<=n;i++)
{
ans=min(ans,dijkstra(i));
}
cout<<ans<<endl;
}
return 0;
}