AcWing----853. 有边数限制的最短路 (Java)_Bellman-Ford算法_边数限制_负权回路

853. 有边数限制的最短路

原题链接

①. 题目

在这里插入图片描述

②. 思路

不能使用 Dijkstra 解决含负权图的问题

在这里插入图片描述

  • 其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在 n-1 次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。
  • bellman - ford算法擅长解决有边数限制的最短路问题。

BellMan-Ford算法步骤

	// bellman - ford算法擅长解决有边数限制的最短路问题
	  for n次
		for 所有边 a,b,w (松弛操作)
			dist[b] = min(dist[b],back[a] + w)
			back[] 数组是上一次迭代后 dist[] 数组的备份

  • back[] 数组是上一次迭代后 dist[] 数组的备份,由于是每个点同时向外出发,因此需要对 dist[] 数组进行备份,若不进行备份会因此发生串联效应,影响到下一个点

③. 学习点

Bellman-Ford算法

④. 代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    
    
	/* bellman - ford算法擅长解决有边数限制的最短路问题
	 * for n次
		for 所有边 a,b,w (松弛操作)
			dist[b] = min(dist[b],back[a] + w)
			back[] 数组是上一次迭代后 dist[] 数组的备份
	 */
	static int N=510;
	static int M=100010;
	static int n,m,k;
	static int[] dist=new int[N];
	static Node[] list=new Node[M];
	static int INF=0x3f3f3f3f;
	static int[] back=new int[N]; //备份dist数组
	public static void main(String[] args) throws IOException {
    
    
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] s = br.readLine().split(" ");
		n=Integer.parseInt(s[0]);
		m=Integer.parseInt(s[1]);
		k=Integer.parseInt(s[2]);
		for (int i = 0; i <m; i++) {
    
    
			String[] s2 = br.readLine().split(" ");
			int a = Integer.parseInt(s2[0]);
			int b = Integer.parseInt(s2[1]);
			int c = Integer.parseInt(s2[2]);
			list[i]=new Node(a,b,c);
		}
		bellman_ford();
	}
	
	static void bellman_ford() {
    
    
	//全部填充INF
		Arrays.fill(dist, INF);
		//自己到自己的距离为0
		dist[1]=0;
		
		//最多经过k条边
		for (int i = 0; i <k; i++) {
    
    
		//数组备份
			back=Arrays.copyOf(dist, n+1);//由于是从1开始存到n
			for (int j = 0; j <m; j++) {
    
     //循环j从1到m,遍历m条边,把所有边都进行松弛操作;
				Node node=list[j];
				int a=node.a;
				int b=node.b;
				int c=node.c;
				//进行距离比较 取最短距离
				dist[b]=Math.min(dist[b], back[a]+c);
			}
		}
		//INF是一个确定的值,并非真正的无穷大,会随着其他数值而受到影响,dist[n]大于某个与INF相同数量级的数即可
		if(dist[n] > INF/2) System.out.println("impossible");
        else System.out.println(dist[n]);
	}

}

class Node{
    
    
	int a,b,c;
	public Node(int a,int b,int c) {
    
    
		this.a=a;
		this.b=b;
		this.c=c;
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45480785/article/details/114106684