1. 程式人生 > 實用技巧 >Acwing 有邊數限制的最短路(Bellman_ford演算法)

Acwing 有邊數限制的最短路(Bellman_ford演算法)

地址:https://www.acwing.com/problem/content/855/

解析:

圖裡含有負權邊,所以考慮Bellman_ford演算法。

Bellman_ford就是從區域性擴充套件到全域性,得的是區域性最優解,與Dijkstra有著很大不同。

本題要求最多經過k條邊到n點的最短距離,那麼引入back[]陣列,用來記錄上一次dis[]的狀態。

對於樣例一:在第一次的Bellman_ford中,2->3是不應該被更新的,只能更新1->3,這裡就體現了back[]陣列的作用。具體的建議手推幾遍。

#include<iostream>
#include<cstring>
#include
<algorithm> #include<queue> #include<stack> using namespace std; const int maxn=1e4+10; const int inf=0x3f3f3f3f; int u[maxn],v[maxn],w[maxn]; int dis[maxn],back[maxn]; int n,k,m; int bellman_ford() { memset(dis,inf,sizeof(dis)); dis[1]=0; for(int i=1;i<=k;i++) { memcpy(back,dis,
sizeof(dis)); for(int i=1;i<=m;i++) { dis[v[i]]=min(dis[v[i]],back[u[i]]+w[i]); } } if(dis[n]>inf/2) return -1; return dis[n]; } int main() { cin>>n>>m>>k; for(int i=1;i<=m;i++) { cin>>u[i]>>v[i]>>w[i]; }
int t=bellman_ford(); if(t==-1) cout<<"impossible"<<endl; else cout<<t<<endl; }