首页 > 其他分享 >SPFA

SPFA

时间:2023-03-23 22:12:13浏览次数:43  
标签:int param next SPFA static new dis

image-20230322222303032

image-20230322222402937

image-20230322224249180

image-20230322224335365

image-20230322224415881

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class SPFA {
	public static void main(String[] args) {

	}

	// 边存储所用到的变量
	static int N = 1010;
	static int cnt = 0; // 边的编号
	static int[] first = new int[N];
	static Edge[] edges = new Edge[N];
	// spfa 所用到的变量
	static int[] dis = new int[N];// 动态更新一个 dis 数组
	static int[] isV = new int[N];// 标记这个顶点是否在队列中
	static int INF = Integer.MAX_VALUE;// 表示不可达

	/**
	 * 添加边的函数
	 * 
	 * @param u 起点
	 * @param v 终点
	 * @param w 权值
	 */
	static void add(int u, int v, int w) {
		edges[++cnt] = new Edge(v, w, first[u]);
		first[u]++;
	}

	static void spfa(int x) {
		// 初始化
		Arrays.fill(dis, INF);
		dis[x] = 0;
		Queue<Integer> q = new LinkedList<>();
		q.add(x);
		isV[x] = 1;
		while (!q.isEmpty()) {
			int u = q.remove();
			isV[u] = 0;
			for (int i = first[u]; i != 0; i = edges[u].next) {// 遍历以 u 为起点的所有边
				int to = edges[i].to;
				if (dis[to] > dis[u] + edges[i].w) {
					dis[to] = dis[u] + edges[i].w;
					// 松弛成功尝试加入队列
					if (isV[i] == 0) {
						q.add(i);
						isV[i] = 1;
					}
				}
			}
		}
	}
}

/**
 * 边类 三个属性
 *
 */
class Edge {
	int to;
	int w;
	int next;

	/**
	 * @param to   终点
	 * @param w    权值
	 * @param next 下一条边
	 */
	public Edge(int to, int w, int next) {
		super();
		this.to = to;
		this.w = w;
		this.next = next;
	}

}

其中涉及到图的存储问题,请移步链式前向星 - ChuenSan - 博客园 (cnblogs.com)

标签:int,param,next,SPFA,static,new,dis
From: https://www.cnblogs.com/ChuenSan/p/17249684.html

相关文章

  • Bellman_ford和spfa算法
    Bellman_ford算法bellman_ford算法在要求起点到终点存在负权边,要求在指定k步(这是spfa无法替代的)bellman_ford和spfa都可以判断图中有无负权环......
  • J - 【黄色】这题真的是模板题 Gym - 102072J 【 SPFA 】
    J-【黄色】这题真的是模板题 Gym-102072J 在看完其他出题人出的毒瘤题之后,良心出题人终于看不下去了,决定出一道模板题来送给大家一个AC,那么,你们能不能接住这个......
  • 【Luogu3371】【模板】单源最短路径(SPFA)
    problem给出一个有向图求从某一点出发到所有点的最短路solutionSPFAcodes#include<iostream>#include<queue>#include<cstring>#definemaxn10010#definem......
  • hdu-1874-畅通工程续(dijkstra + SPFA )
    畅通工程续TimeLimit:3000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):36928    AcceptedSubmission(s):13......
  • 算法之Dijkstra及其堆优化和SPFA:图上单源最短路径神器
    签到题……题目传送门SPFA算法本人曾经写过一篇有关Bellman-ford的博,但就算是挂了优化的ford也只能过这道题的弱化版。今天就先填个坑,先讲SPFA。在这里我直接认为你们......
  • 算法之SPFA的前置:Bellman-Ford算法
    SPFA我们都知道一个叫SPFA的算法,它是用来计算单源最短路径的,但是,众所周知它不是很稳定,容易退化。SPFA是基于什么被提出的?基于一个叫做Bellman-Ford的算法。Bellman-For......
  • poj3255 Roadblocks--次短路spfa
    原题链接:​​http://poj.org/problem?id=3255​​题意:n个点,标号为1到n,m条路,u,v,len,表示u与v之间路长为len,求1到n第二短路长,题目保证存在第二短路径。#define_CRT_SECURE_NO_D......
  • SPFA最短路算法
    ShortestPathFastestAlgorithm(spfa)单源最短路、存在负权边这个算法因为与Bellman-Ford算法比较相似,只是在它的算法的基础上进行了队列优化,因此也被嘲讽为“队列优......
  • spfa判负环
    模板题题目描述给定一个\(n\)个点的有向图,请求出图中是否存在从顶点\(1\)出发能到达的负环。负环的定义是:一条边权之和为负数的回路。输入格式本题单测试点有多组......
  • 洛谷P1462spfa + 二分答案
    第一次接触二分答案的题目最开始是没有思路的看了一个题解,然后强行理解之后开始自己打了一遍,然而结果是只得了30分过了3个点其他全wa,之后是漫长的debug,这里想感慨一句自己d......