C ++ 구현 Dijstra 알고리즘 (단일 소스 최단 경로 알고리즘)

도 1 Dijstra 알고리즘은 버텍스의 나머지 꼭지점에 대한 최단 경로

알고리즘 Dijstra 생각 : 정점들의 세트는 두 개의 T 및 S, 정점 도면에 저장된 상기 집합 S에 설치되고, 초기 상태에서, 세트 S는 단지 소스 V0 포함 최단 경로, 나머지도 정점에 저장된 T의 세트를 발견 다음 세트 S에 정점 V 혼입 세트 T 정점 V0 최단 경로 길이로부터 계속 선택한 정점의 세트 S는 각각 최단 경로 길이 값 T 정점에 설정 될 새로운 변형 정점 V0 혼입

나는 두 가지 단계가 있습니다 느낌을 요약하면 :

정점까지의 최단 경로의 나머지 ① 선택된 소스 정점

② 각 각 정점 첨가 같이 정점 나머지 꼭지점에 대한 소스의 경로를 업데이트해야 선택은 경로의 작용에 의해 정점의 나머지 꼭지점에 대한 소스를 발생할 수 있음은 경로 0-3의 소스로 짧아진다 4 그런데 세 짧은 경로가되도록 한 후 인용 최단 경로 노드 (1)의 3 개 개의 정점에 업데이트해야했다

2. 내가 Dijstra 프림 알고리즘을 느끼고 최소 스패닝 트리 알고리즘이 매우 유사 프로그램의 차이 : 꼼꼼한 알고리즘 D []는 현재의 정점 최단 경로 정점 나머지 레코드의 배열은, 알고리즘 레코드 소스 Dijstra 어레이 우리는 또한 이들의 개념을 이해하기 위해 두 알고리즘을 비교 될 수없는 동일한 경우 최단 경로의 정점의 나머지 포인트는,이 차분 갱신 D [] 값 초래

여기서 오른쪽의 구체적인 예는 다음과 같습니다

그래서 같은 소스 정점 0은 최초의 정점 0과 접촉 정점을 선택하면,이 정점의 접촉 경로가 점 광원에 도달하기 전에보다 짧은 여부를 0에서 정점의 순환에 결정된다, 그것은 경로에서 찾을 수 있습니다되고있다 어떤 경로가 없기 때문에 짧고, 그 정점 -1,3,4- 정점 나머지 짧은 경로를 선택 D는 [] 배열은 다음의 소스에 대응하는 3 개 개의 꼭지점을 업데이트 할 때까지, 정점은 경로 0-1에서 찾을 수있다 이전 소스 짧은 발견보다 정점 3 접점에서 찾을 수있는 최단이 때문에 하나 개의 꼭지점을 선택하여 상기의 단계를 반복하고,이를 경로가 짧아 3/3 여부 경로의 정점에 정점 판정 그래서 업데이트, 나머지 정점 있도록 같은 이유는

다음과 같이 테스트 데이터는 다음과 같습니다

6 8 0
0 1 1 
0 3 4 
0 4 4 
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
#include<cstdio>
#include<iostream>
using namespace std;
const int maxSize = 1000;
const int INF = 100000000;
int n, m, s, G[maxSize][maxSize];
int d[maxSize];
bool vis[maxSize] = {false};

void Dijstra(int s){
	fill(d, d + maxSize, INF);
	d[s] = 0;
	for(int i = 0; i < n; i++){
		int u = -1, min = INF;
		for(int j = 0; j < n; j++){
			if(vis[j] == false && d[j] < min){
				u = j;
				min = d[j];
			}
		}
		if(u == -1) return;
		vis[u] = true;
		for(int v = 0; v < n; v++){
			if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]){
				d[v] = d[u] + G[u][v];
			}
		}
	}	
}

int main(void){
	int u, v, w;
	cin >> n >> m >> s;
	//初始化二维数组 
	fill(G[0], G[0] + maxSize * maxSize, INF);
	for(int i = 0; i < m; i++){
		cin >> u >> v >> w;
		G[u][v] = w;
	}
	Dijstra(s);
	for(int i = 0; i < n; i++){
		cout << d[i] << " ";
	}
}

 

추천

출처blog.csdn.net/qq_39445165/article/details/93192203