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. 有边数限制的最短路 模板

AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)

备战蓝桥杯—有边数限制的最短路 (bellman_ford+)——[AcWing]有边数限制的最短路

[边数限制最短路 倍增floyd 矩阵优化]Cow Relays G

贝尔曼福特算法

bellman_ford