中文题题意请看题
因为数据范围比较小,所以直接枚举等级上届和下届,然后对于在这个等级范围内的人所建的图跑最短路
#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; } int main() { 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; } ans=min(ans,spfa()); } printf("%d ",ans); return 0; }