Java java지도 시간 SPFA 알고리즘 사용 튜토리얼

SPFA 알고리즘 사용 튜토리얼

Jul 20, 2017 am 10:23 AM
연산 상해

적용 범위: 주어진 그래프에는 음의 가중치 가장자리가 있습니다. 이때 Dijkstra와 같은 알고리즘은 사용할 곳이 없으며 Bellman-Ford 알고리즘의 복잡성이 너무 높기 때문에 SPFA 알고리즘이 유용합니다. . 우리는 방향성 가중치 그래프 G에는 음의 가중치 사이클이 없다는 점, 즉 최단 경로가 존재해야 한다는 점에 동의합니다. 물론, 음의 가중치 주기가 있는지 확인하기 위해 알고리즘을 실행하기 전에 위상 정렬을 수행할 수 있지만 이것이 우리 논의의 초점은 아닙니다.

알고리즘 아이디어: 배열 d를 사용하여 각 노드의 최단 경로 추정치를 기록하고 인접 목록을 사용하여 그래프 G를 저장합니다. 우리가 채택하는 방법은 동적 근사 방법입니다. 최적화할 노드를 저장하기 위해 선입선출 대기열을 설정합니다. 최적화 중에 매번 헤드 노드 u를 꺼내고 현재 최단 경로 추정을 사용합니다. 포인트 u가 포인트 u를 떠나도록 포인트 v가 완화 작업을 수행합니다. 포인트 v의 최단 경로 추정이 조정되고 포인트 v가 현재 대기열에 없으면 포인트 v가 대기열의 끝에 배치됩니다. 이러한 방식으로 대기열이 빌 때까지 노드를 계속해서 꺼내어 완화 작업을 수행하게 되며, 예상되는 시간 복잡도는 O(ke)이며, 여기서 k는 모든 정점이 대기열에 들어가는 평균 횟수임을 증명할 수 있습니다. k는 일반적으로 2보다 작거나 같습니다.

구현 방법:

대기열을 생성합니다. 처음에는 대기열에 시작점만 있고, 이후에는 시작점에서 모든 지점까지의 최단 경로를 기록하는 테이블을 생성합니다. 테이블의 초기값은 극단값에 할당되어야 합니다. 큰 값의 경우 이 지점에서 자체까지의 경로는 0으로 할당됩니다. 그런 다음 큐의 일부 포인트를 시작점으로 사용하여 모든 포인트에 대한 최단 경로를 새로 고치는 이완 작업을 수행합니다. 새로 고침에 성공하고 새로 고친 포인트가 큐에 없으면 포인트가 큐 끝에 추가됩니다. . 대기열이 빌 때까지 반복합니다.

음수 순환이 있는지 확인:

포인트가 N 번 이상 대기열에 들어가면 음수 순환이 있습니다(SPFA는 음수 순환이 있는 그래프를 처리할 수 없습니다)



建 建

먼저 시작점 A를 나머지 점의 최단 경로 테이블로 설정합니다. 시기:

 1. 첫 번째 요소(a )을 Dequeue하고 a를 시작점으로 모든 Edge의 끝점에 대해 완화 작업을 수행합니다(여기서는 b, c, d 세 지점이 있음). 이때 경로 테이블 상태는 다음과 같습니다.松
휴식 시 세 지점의 최단 경로에 대한 평가가 작아졌으며 이러한 대기열은 팀에 들어가야 합니다. 이때 대기열은 세 개로 새로 입력됩니다. , c, d

첫 번째 요소 b가 대기열에서 제외되고 b를 시작점으로 하는 모든 가장자리의 끝점은 순서대로 완화됩니다(여기서는 점 e만 있음). 테이블 상태는 다음과 같습니다.

                                                                         ~  최단 경로 테이블에서는 e의 최단 경로 추정값도 작아졌고 e는 큐에 존재하지 않으므로 e도
큐에 합류해야 합니다. , d, e

c점에서 팀의 첫 번째 요소가 팀 외부에 있고, c를 시작점으로 모든 모서리의 끝점에 대해 이완 연산이 수행됩니다(e와 f의 두 점이 있습니다). 여기) 현재 경로 양식 상태는 입니다.径 · 최단 경로 테이블에서는 E, F의 최단 경로 평가가 작아졌고, 큐에는 E가 존재하고 F는 존재하지 않습니다. 따라서

e는 큐에 합류할 필요가 없고, f는 큐에 합류해야 합니다. 이때 큐에 있는 요소는 d, e, f

팀의 첫 번째 요소가 큐를 떠납니다. d 지점에서, 그리고 d를 시작점으로 하는 모든 모서리의 끝 지점에서 순차적으로 완화 작업을 수행합니다(여기서는 지점 g만 있음). 이때 경로 테이블 상태는

최단 경로 테이블에서 g의 최단 경로 추정은 더 작아지지 않으며(완화 실패), 새 노드가 큐에 합류하지 않으며, 큐의 요소는 f, g

첫 번째 요소입니다. 팀은 f 지점에서 대기열을 벗어났고 f를 시작점으로 하는 모든 가장자리의 끝 지점이 순차적으로 완화됩니다(여기에는 d, e, g 세 지점이 있습니다). 이때 경로 테이블 상태는 다음과 같습니다. is:

       e 지점은 없고 e는 대기열에 있으며, g는 대기열에 있을 필요가 없습니다. g이고 큐의 첫 번째 요소인 점 g는 큐에서 벗어납니다. g를 시작점으로 하는 모든 가장자리에 대해 끝점은 차례로 완화됩니다(여기서는 B만 있습니다). 경로 테이블의 상태는 다음과 같습니다.

최단 경로 테이블에서는 B의 최단 경로 평가가 작아지고 대기열에 B가 없습니다. 이때 b가 대기열에 들어갑니다. , 대기열의 요소는 e이고 팀의 첫 번째 요소 b


점 e가 대기열을 떠납니다. e를 시작점으로 하는 모든 가장자리의 끝점에서 완화 작업이 수행됩니다(여기에는 점 g만 있습니다). ), 이때 경로 테이블 상태는

此 최단 경로 테이블에서 G의 최단 경로 평가는 변경되지 않았습니다(실패). 대기열의 요소는 B

팀의 첫 번째 요소인 b 지점이 대기열에서 제거되고 b를 시작점으로 하는 모든 가장자리의 끝점에 대해 완화 작업이 수행됩니다(여기에는 지점 e만 있음). 이때 경로 테이블 상태는
   최단 경로 테이블에서 e의 최단 경로 추정은 변경되지 않았으며(완화 실패) 현재 큐는 비어 있습니다

최종 a에서 g까지의 최단 경로는 14

java code

package spfa负权路径;

import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;
public class SPFA {
	/**
	 * @param args
	 */
	public long[] result;         //用于得到第s个顶点到其它顶点之间的最短距离
	//数组实现邻接表存储
	class edge{
		public int a;//边的起点
		public int b;//边的终点
		public int value;//边的值
		public edge(int a,int b,int value){
			this.a=a;
			this.b=b;
			this.value=value;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SPFA spafa=new SPFA();
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int s=scan.nextInt();
		int p=scan.nextInt();
		edge[] A=new edge[p];
		for(int i=0;i<p;i++){
			int a=scan.nextInt();
			int b=scan.nextInt();
			int value=scan.nextInt();
			A[i]=spafa.new edge(a,b,value);
		}
		if(spafa.getShortestPaths(n,s,A)){
			for(int i=0;i<spafa.result.length;i++){
				System.out.println(spafa.result[i]+" ");
			}
		}else{
			System.out.println("存在负环");
		}
	}
	/*
     * 参数n:给定图的顶点个数
     * 参数s:求取第s个顶点到其它所有顶点之间的最短距离
     * 参数edge:给定图的具体边
     * 函数功能:如果给定图不含负权回路,则可以得到最终结果,如果含有负权回路,则不能得到最终结果
     */
	private boolean getShortestPaths(int n, int s, edge[] A) {
		// TODO Auto-generated method stub
		ArrayList<Integer> list = new ArrayList<Integer>();
		result=new long[n];
		boolean used[]=new boolean[n];
		int num[]=new int[n];
		for(int i=0;i<n;i++){
			result[i]=Integer.MAX_VALUE;
			used[i]=false;
		}
		result[s]=0;//第s个顶点到自身距离为0
		used[s]=true;//表示第s个顶点进入数组队
		num[s]=1;//表示第s个顶点已被遍历一次
		list.add(s); //第s个顶点入队
		while(list.size()!=0){
			int a=list.get(0);//获取数组队中第一个元素
			list.remove(0);//删除数组队中第一个元素
			for(int i=0;i<A.length;i++){
			//当list数组队的第一个元素等于边A[i]的起点时
				if(a==A[i].a&&result[A[i].b]>(result[A[i].a]+A[i].value)){
					result[A[i].b]=result[A[i].a]+A[i].value;
					if(!used[A[i].b]){
						list.add(A[i].b);
						num[A[i].b]++;
						if(num[A[i].b]>n){
							return false;
						}
						used[A[i].b]=true;//表示边A[i]的终点b已进入数组队
					}
				}
			}
			used[a]=false; //顶点a出数组对
		}
		return true;
	}
}
로그인 후 복사

 입니다.

위 내용은 SPFA 알고리즘 사용 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CLIP-BEVFormer: BEVFormer 구조를 명시적으로 감독하여 롱테일 감지 성능을 향상시킵니다. CLIP-BEVFormer: BEVFormer 구조를 명시적으로 감독하여 롱테일 감지 성능을 향상시킵니다. Mar 26, 2024 pm 12:41 PM

위에 작성 및 저자의 개인적인 이해: 현재 전체 자율주행 시스템에서 인식 모듈은 중요한 역할을 합니다. 자율주행 시스템의 제어 모듈은 적시에 올바른 판단과 행동 결정을 내립니다. 현재 자율주행 기능을 갖춘 자동차에는 일반적으로 서라운드 뷰 카메라 센서, 라이더 센서, 밀리미터파 레이더 센서 등 다양한 데이터 정보 센서가 장착되어 다양한 방식으로 정보를 수집하여 정확한 인식 작업을 수행합니다. 순수 비전을 기반으로 한 BEV 인식 알고리즘은 하드웨어 비용이 저렴하고 배포가 용이하며, 출력 결과를 다양한 다운스트림 작업에 쉽게 적용할 수 있어 업계에서 선호됩니다.

Win11에서 관리자 권한을 얻는 방법에 대한 자세한 설명 Win11에서 관리자 권한을 얻는 방법에 대한 자세한 설명 Mar 08, 2024 pm 03:06 PM

Windows 운영 체제는 세계에서 가장 인기 있는 운영 체제 중 하나이며, 새로운 버전의 Win11이 많은 주목을 받았습니다. Win11 시스템에서 관리자 권한을 얻는 것은 사용자가 시스템에서 더 많은 작업과 설정을 수행할 수 있도록 하는 중요한 작업입니다. 이번 글에서는 Win11 시스템에서 관리자 권한을 얻는 방법과 권한을 효과적으로 관리하는 방법을 자세히 소개하겠습니다. Win11 시스템에서 관리자 권한은 로컬 관리자와 도메인 관리자의 두 가지 유형으로 나뉩니다. 로컬 관리자는 로컬 컴퓨터에 대한 모든 관리 권한을 갖습니다.

C++에서 기계 학습 알고리즘 구현: 일반적인 과제 및 솔루션 C++에서 기계 학습 알고리즘 구현: 일반적인 과제 및 솔루션 Jun 03, 2024 pm 01:25 PM

C++의 기계 학습 알고리즘이 직면하는 일반적인 과제에는 메모리 관리, 멀티스레딩, 성능 최적화 및 유지 관리 가능성이 포함됩니다. 솔루션에는 스마트 포인터, 최신 스레딩 라이브러리, SIMD 지침 및 타사 라이브러리 사용은 물론 코딩 스타일 지침 준수 및 자동화 도구 사용이 포함됩니다. 실제 사례에서는 Eigen 라이브러리를 사용하여 선형 회귀 알고리즘을 구현하고 메모리를 효과적으로 관리하며 고성능 행렬 연산을 사용하는 방법을 보여줍니다.

Oracle SQL의 나누기 연산에 대한 자세한 설명 Oracle SQL의 나누기 연산에 대한 자세한 설명 Mar 10, 2024 am 09:51 AM

OracleSQL의 나눗셈 연산에 대한 자세한 설명 OracleSQL에서 나눗셈 연산은 두 숫자를 나눈 결과를 계산하는 데 사용되는 일반적이고 중요한 수학 연산입니다. 나누기는 데이터베이스 쿼리에 자주 사용되므로 OracleSQL에서 나누기 작업과 사용법을 이해하는 것은 데이터베이스 개발자에게 필수적인 기술 중 하나입니다. 이 기사에서는 OracleSQL의 나누기 작업 관련 지식을 자세히 설명하고 독자가 참고할 수 있는 특정 코드 예제를 제공합니다. 1. OracleSQL의 Division 연산

C++sort 함수의 기본 원리와 알고리즘 선택을 살펴보세요. C++sort 함수의 기본 원리와 알고리즘 선택을 살펴보세요. Apr 02, 2024 pm 05:36 PM

C++정렬 함수의 맨 아래 계층은 병합 정렬을 사용하고 복잡도는 O(nlogn)이며 빠른 정렬, 힙 정렬 및 안정 정렬을 포함한 다양한 정렬 알고리즘 선택을 제공합니다.

인공지능이 범죄를 예측할 수 있을까? CrimeGPT의 기능 살펴보기 인공지능이 범죄를 예측할 수 있을까? CrimeGPT의 기능 살펴보기 Mar 22, 2024 pm 10:10 PM

인공지능(AI)과 법 집행의 융합은 범죄 예방 및 탐지의 새로운 가능성을 열어줍니다. 인공지능의 예측 기능은 범죄 행위를 예측하기 위해 CrimeGPT(범죄 예측 기술)와 같은 시스템에서 널리 사용됩니다. 이 기사에서는 범죄 예측에서 인공 지능의 잠재력, 현재 응용 프로그램, 직면한 과제 및 기술의 가능한 윤리적 영향을 탐구합니다. 인공 지능 및 범죄 예측: 기본 CrimeGPT는 기계 학습 알고리즘을 사용하여 대규모 데이터 세트를 분석하고 범죄가 발생할 가능성이 있는 장소와 시기를 예측할 수 있는 패턴을 식별합니다. 이러한 데이터 세트에는 과거 범죄 통계, 인구 통계 정보, 경제 지표, 날씨 패턴 등이 포함됩니다. 인간 분석가가 놓칠 수 있는 추세를 식별함으로써 인공 지능은 법 집행 기관에 권한을 부여할 수 있습니다.

탐지 알고리즘 개선: 고해상도 광학 원격탐사 이미지에서 표적 탐지용 탐지 알고리즘 개선: 고해상도 광학 원격탐사 이미지에서 표적 탐지용 Jun 06, 2024 pm 12:33 PM

01 전망 요약 현재로서는 탐지 효율성과 탐지 결과 간의 적절한 균형을 이루기가 어렵습니다. 우리는 광학 원격 탐사 이미지에서 표적 감지 네트워크의 효과를 향상시키기 위해 다층 특징 피라미드, 다중 감지 헤드 전략 및 하이브리드 주의 모듈을 사용하여 고해상도 광학 원격 감지 이미지에서 표적 감지를 위한 향상된 YOLOv5 알고리즘을 개발했습니다. SIMD 데이터 세트에 따르면 새로운 알고리즘의 mAP는 YOLOv5보다 2.2%, YOLOX보다 8.48% 우수하여 탐지 결과와 속도 간의 균형이 더 잘 이루어졌습니다. 02 배경 및 동기 원격탐사 기술의 급속한 발전으로 항공기, 자동차, 건물 등 지구 표면의 많은 물체를 묘사하기 위해 고해상도 광학 원격탐사 영상이 활용되고 있다. 원격탐사 이미지 해석에서 물체 감지

PHP 모듈로 연산자의 역할과 사용법에 대한 자세한 설명 PHP 모듈로 연산자의 역할과 사용법에 대한 자세한 설명 Mar 19, 2024 pm 04:33 PM

PHP의 모듈로 연산자(%)는 두 숫자를 나눈 나머지를 구하는 데 사용됩니다. 이 글에서는 모듈로 연산자의 역할과 사용법을 자세히 논의하고 독자의 이해를 돕기 위해 구체적인 코드 예제를 제공합니다. 1. 모듈로 연산자의 역할 수학에서는 정수를 다른 정수로 나누면 몫과 나머지가 나옵니다. 예를 들어 10을 3으로 나누면 몫은 3이고 나머지는 1입니다. 이 나머지를 얻기 위해 모듈로 연산자가 사용됩니다. 2. 모듈러스 연산자의 사용법 PHP에서는 모듈러스를 나타내기 위해 % 기호를 사용합니다.

See all articles