Please refer to the title for the meaning of the title in Chinese
Because the data range is relatively small, the previous and next grades are directly enumerated, and then the shortest path is run for the graphs created by people within this grade range.
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int inf=0x3f3f3f3f; const int N=102; int s[N][N]; int dis[N],lev[N],val[N]; bool vis[N],ok[N]; int n,m; queue<int>q; int spfa() { int ret = inf; memset(dis,inf,sizeof(dis)); dis[1]=0; q.push(1); while(!q.empty()) { int u=q.front();vis[u]=0;q.pop(); for(int v=1;v<=n;v++) { if(!ok[v]||u==v) continue; if(dis[v]>dis[u]+s[u][v]) { dis[v]=dis[u]+s[u][v]; if(!vis[v])q.push(v),vis[v]=1; } } } for ( int i = 1 ; i <= n; i ++) ret = min (ret, dis [i] + val [i]); return ret; } intmain () { scanf("%d%d",&m,&n); memset(s,inf,sizeof(s)); for(int i=1,x;i<=n;i++) { scanf("%d%d%d",&val[i],&lev[i],&x); for(int j=1,v,w;j<=x;j++) { scanf("%d%d",&v,&w); s[i][v]=w; } } int ans=inf; for(int i=0;i<=m;i++) { memset(ok,0,sizeof(ok)); for(int j=1;j<=n;j++) { if(lev[j]>=lev[1]-m+i&&lev[j]<=lev[1]+i) ok[j]=true; } years = min(years,spfa()); } printf("%d\n",ans); return 0; }