题目
传送门:QWQ
分析
最短路显然,但不好搞地位等级。。。。。
地位等级不好搞?那么就暴力。。
枚举我们允许的地位等级,跑最短路。
所以$ n^2logn $出100什么鬼啊,很有迷惑性啊
还有4篇cf没补博客好慌啊
代码
细节不少,WA了好几发
//#include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cstring> using namespace std; const int maxn=1200, INF=1e9; struct Edge{ int u,v,dis; }; vector<Edge> edges; vector<int> G[maxn]; void Addedge(int u,int v,int dis){ edges.push_back((Edge){u,v,dis}); G[u].push_back(edges.size()-1); } int l[maxn], L, R, val[maxn]; struct HeapNode{ int x,dis; bool operator < (const HeapNode& a) const{ return dis>a.dis; } }; priority_queue<HeapNode> que; int d[maxn],vis[maxn], n; int dijkstra(int s ){ if(l[s]<L || l[s]>R) return val[s]; memset(d,127,sizeof(d)); memset(vis,0,sizeof(vis)); d[s]=0; que.push((HeapNode){s,0}); //vis[s]=1; while(!que.empty()){ HeapNode x=que.top(); que.pop(); if(vis[x.x]) continue; vis[x.x]=1; int u=x.x; for(int i=0;i<G[u].size();i++){ Edge& e=edges[G[u][i]]; if(l[e.v]>=L && l[e.v]<=R && d[e.v]>d[u]+e.dis){ d[e.v]=d[u]+e.dis; que.push((HeapNode){e.v,d[e.v]}); } } } int ans=1e9; for(int i=1;i<=n;i++){ ans=min(ans,d[i]+val[i]); } return ans; } int main(){ int m; scanf("%d%d",&m,&n); int x, q=0,b,c; for(int i=1;i<=n;i++){ scanf("%d%d%d",&val[i],&l[i],&x); while(x--){ scanf("%d%d",&b,&c); Addedge(i,b,c); } q=max(q,l[i]); } int ans=INF; for(int i=1;i<=max(q-m,n);i++){ L=i; R=i+m; ans=min(ans,dijkstra(1)); } printf("%d\n",ans); return 0; }