853. 有边数限制的最短路
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了853. 有边数限制的最短路相关的知识,希望对你有一定的参考价值。
https://www.acwing.com/problem/content/855/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=510;
const int M=1e4+10;
int n,m,k; // n表示点数,m表示边数
int dist[N],backup[N]; // dist[x]存储1到x的最短路距离
struct Edge // 边,a表示出点,b表示入点,w表示边的权重
{
int a, b, w;
}edges[M];
// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
int bellman_ford()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
// 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由
//抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
for (int i = 0; i < k; i ++ )
{
memcpy(backup,dist,sizeof dist);
for (int j = 0; j < m; j ++ )
{
int a = edges[j].a, b = edges[j].b, w = edges[j].w;
dist[b]=min(dist[b],backup[a]+w);
}
}
if (dist[n] > 0x3f3f3f3f / 2) return -1;
return dist[n];
}
int main(void)
{
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
cin>>edges[i].a>>edges[i].b>>edges[i].w;
}
if(bellman_ford()==-1) cout<<"impossible"<<endl;
else cout<<bellman_ford()<<endl;
return 0;
}
以上是关于853. 有边数限制的最短路的主要内容,如果未能解决你的问题,请参考以下文章
AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)
备战蓝桥杯—有边数限制的最短路 (bellman_ford+)——[AcWing]有边数限制的最短路