题目
解释
- AcWing 853. 有边数限制的最短路 - AcWing
- 重点关注
- 松弛的原理
- 为什么要用backup数组
- 为什么判断要用0x3f3f3f3f/2
- 与迪杰斯特拉不同的是
-
- 迪杰斯特拉是每次从未确定最短路的点中选最短的一条来更新
- 例如上图顺序是1->2->4->5
- 而bf算法是对于每个结点的距离更新,将其和上一轮全部已经更新过的路径比较,选择最短路径(即在每次松弛时,将每个边都遍历更新一下)
- 从1->2,3->4->5
- 时间复杂度为O(N^2)
代码段
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=10010;
int dist[N],backup[N];
int n,m,k;
struct Edge
{
int x;
int y;
int w;
}e[M];
int bellman_ford()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
for(int i=1;i<=k;i++)
{
memcpy(backup,dist,sizeof dist);
for(int j=1;j<=m;j++)
{
int a=e[j].x,b=e[j].y,w=e[j].w;
dist[b]=min(dist[b],backup[a]+w);
}
}
if(dist[n]>0x3f3f3f3f/2)return -1;
else
return dist[n];
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int x,y,w;
cin>>x>>y>>w;
e[i]={x,y,w};
}
int res=bellman_ford();
if(res==-1)cout<<"impossible"<<endl;
else
cout<<res<<endl;
return 0;
}