洛谷P2939 [USACO09FEB]Revamping Trails G
题目
https://www.luogu.com.cn/problem/P2939
思路
分层图最短路的板子题,考虑到是稀疏图,用堆优化的dijkstra算法比较合理。
代码
#include
#include
#include
#include
#define maxn 50010
#define inf 0x3f3f3f3f
using namespace std;
int fst[maxn],nxt[maxn<<1],to[maxn<<1],w[maxn<<1],cnt=0;
int d[maxn][21];
int vis[maxn][21];
struct node{
int dis,idx,idy;
bool operator <(const node &t) const{
return dis>t.dis;
}
node(){}
node(int x,int y,int z){
dis=x;idx=y;idy=z;
}
};
void add(int x,int y,int z){
to[++cnt]=y;
w[cnt]=z;
nxt[cnt]=fst[x];
fst[x]=cnt;
}
int dijkstra(int n,int k){
int i,j;
priority_queue q;
for(i=1;i<=n;++i)
for(j=0;j<=k;++j)
vis[i][j]=0;
for(i=1;i<=n;++i)
for(j=0;j<=k;++j)
d[i][j]=inf;
d[1][k]=0;
q.push(node(0,1,k));
while(!q.empty()){
while(!q.empty()&&vis[q.top().idx][q.top().idy]) q.pop();
if(q.empty()) break;
node p=q.top();
q.pop();
vis[p.idx][p.idy]=1;
for(i=fst[p.idx];i;i=nxt[i]){
if(p.dis+w[i]