这题
我们每次针对一个区间内的点跑最短路即可
//#include<bits/stdc++.h>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
#include<string.h>
using namespace std;
struct edge
{
int v,val,next;
}e[10005];
struct dis
{
int u,val;
bool operator < (const dis& x) const
{
return val>x.val;
}
};
struct node
{
int val,level;
}a[105];
priority_queue<dis>pq;
int tot,d[105],head[105],n,m;
bool vis[105];
void addedge(int u,int v,int val)
{
e[tot]={v,val,head[u]};
head[u]=tot++;
}
void dijkstra(int u,int l,int r)
{
pq.push(dis({u,d[u]}));
while(!pq.empty())
{
u=pq.top().u;
pq.pop();
if(vis[u])
continue;
vis[u]=true;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].v;
if(a[v].level<l||a[v].level>r)
continue;
if(d[v]>d[u]+e[i].val&&!vis[v])
{
if(d[u]+e[i].val>a[v].val)
continue;
d[v]=d[u]+e[i].val;
pq.push(dis({v,d[v]}));
}
}
}
}
int main()
{
int i,j,k,ans,num,sum,x,y,z;
while(~scanf("%d%d",&n,&m))
{
tot=0;
memset(head,-1,sizeof head);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[i].val=x,a[i].level=y;
for(j=1;j<=z;j++)
{
scanf("%d%d",&num,&sum);
addedge(num,i,sum);
}
}
ans=a[1].val;
for(i=max(a[1].level-n,0);i<=a[1].level;i++)
{
for(j=m;j>1;j--)
{
if(a[j].level>=i&&a[j].level<=n+i)
{
memset(d,0x3f,sizeof d);
memset(vis,false,sizeof vis);
d[j]=a[j].val;
dijkstra(j,i,i+n);
ans=min(ans,d[1]);
}
}
}
printf("%d\n",ans);
}
return 0;
}