题意:https://www.acwing.com/problem/content/342/
在郊区有 N 座通信基站,P 条 双向 电缆,第 i 条电缆连接基站AiAi和BiBi。
特别地,1 号基站是通信公司的总站,N 号基站位于一座农场中。
现在,农场主希望对通信线路进行升级,其中升级第 i 条电缆需要花费LiLi。
电话公司正在举行优惠活动。
农产主可以指定一条从 1 号基站到 N 号基站的路径,并指定路径上不超过 K 条电缆,由电话公司免费提供升级服务。
农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。
求至少用多少钱可以完成升级。
分层图。
更新的时候
node e=d[i]; int t=max(dis[ans.num][ans.ci],e.w); if(t<dis[e.to][ans.ci]) { dis[e.to][ans.ci]=t; p tt; tt.num=e.to,tt.x=dis[e.to][ans.ci],tt.ci=ans.ci; q.push(tt); } if(ans.ci>=k) continue; if(dis[e.to][ans.ci+1]>dis[ans.num][ans.ci]) { dis[e.to][ans.ci+1]=dis[ans.num][ans.ci]; p tt; tt.num=e.to,tt.x=dis[e.to][ans.ci+1],tt.ci=ans.ci+1; q.push(tt); }
其余照搬。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int maxn=20009; int n,m,k; struct p{ int x,ci,num; bool operator < (const p&tmp) const{ return x>tmp.x; } }init; struct node{ int to,w,nxt; }d[maxn];int head[maxn],dis[1009][1009],cnt=1; void add(int u,int v,int w){ d[cnt].nxt=head[u],d[cnt].to=v, d[cnt].w=w,head[u]=cnt++; } int vis[1009][1009]; void dij() { memset(dis,20,sizeof(dis)); priority_queue<p>q; init.ci=init.x=0,init.num=1;q.push(init); dis[1][0]=0; while(!q.empty()) { p ans=q.top();q.pop(); if(vis[ans.num][ans.ci]) continue; vis[ans.num][ans.ci]=1; for(int i=head[ans.num];i;i=d[i].nxt) { node e=d[i]; int t=max(dis[ans.num][ans.ci],e.w); if(t<dis[e.to][ans.ci]) { dis[e.to][ans.ci]=t; p tt; tt.num=e.to,tt.x=dis[e.to][ans.ci],tt.ci=ans.ci; q.push(tt); } if(ans.ci>=k) continue; if(dis[e.to][ans.ci+1]>dis[ans.num][ans.ci]) { dis[e.to][ans.ci+1]=dis[ans.num][ans.ci]; p tt; tt.num=e.to,tt.x=dis[e.to][ans.ci+1],tt.ci=ans.ci+1; q.push(tt); } } } } int main() { cin>>n>>m>>k; for(int i=1;i<=m;i++) { int l,r,w; cin>>l>>r>>w; add(l,r,w);add(r,l,w); } dij(); int ans=99999999; for(int i=0;i<=k;i++) ans=min(dis[n][i],ans); if(ans==99999999) cout<<-1; else cout<<ans; }