최단 경로를 찾는 다익스트라 알고리즘

콘텐츠

알고리즘 소개

애플리케이션

알고리즘 단계

암호


 

알고리즘 소개

Dijkstra의 알고리즘은 한 노드에서 다른 노드까지의 최단 경로를 계산하는 데 사용되는 일반적인 최단 경로 알고리즘 입니다. 주요 특징은 시작점에서 끝점 에 도달할 때까지 외부 레이어 (너비 우선 탐색의 아이디어)로 확장된다는 것입니다.

애플리케이션

워터마크,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGC5LiN6ISx5Y-R,size_20,color_FFFFFF,t_70,g_se,x_16

 

알고리즘 단계

1) 시작 정점을 v로 설정하고 정점 세트 VfvI, v2, vi.), v에서 V의 각 정점까지의 거리는 거리 세트 Dis, Dis(dI, d2, di.)를 구성하고 Dis 세트 레코드 v를 그래프의 각 꼭짓점에서 (자신까지의 거리를 0으로 간주할 수 있으며, v에서 vi까지의 거리는 di에 해당)
2) Dis에서 가장 작은 값의 di를 선택하고 Dis set 밖으로 이동함과 동시에 V 집합에서 해당 항목 점 vi를 이동합니다. 이때 v에서 vi로 즉, 최단 경로
3) Dis 집합을 업데이트합니다. 업데이트 규칙은 다음과 같습니다. v에서 V의 꼭짓점까지의 거리 값 비교 v에서 v를 통해 v에서 정점까지의 거리를 설정
하고 더 작은 값을 유지합니다(정점도 동시에 업데이트되어야 함) 의 선행 노드는 vi이며 도달했음을 나타냅니다. vi)
4) 최단 경로 정점이 목표 정점이 될 때까지 두 단계를 반복합니다.

암호


import java.util.Arrays;

public class _最短路{
	static int[] vis;//标记已经访问的顶点  0未访问 1 访问
	static int[] dis;//出发顶点到各个下标对应顶点的最短距离
	static int[] pre;//每个下标对应的上一个顶点下标
	static char[] vertex;//顶点
	static int[][] matrix;//邻接矩阵
	public static void main(String[] args) {
		vertex= new char[]{'A','B','C','D','E','F','G'};
		matrix = new int[vertex.length][vertex.length];
		chushihua(matrix);//初始化邻接矩阵
		djstl(vertex.length,6);//调用算法
	}
	public static void djstl(int length,int start) {
		vis=new int[length];
		dis=new int[length];
		pre=new int[length];
		Arrays.fill(dis, 9999);//初始化距离为较大值
		dis[start] = 0;//初始化出发顶点到自身的距离0
		
		/*  先将起始点到与其连通的顶点的路径及pre前一个顶点进行更新*/
		update(start);
		//在以与起始点相连的顶点为起点  更新距离和路径
		for (int i = 1; i < vertex.length; i++) {
			int minIndex = -1;
			int mindis=9999;
			//找到一个最短路径
			for (int j = 0; j < vertex.length; j++) {
				if(vis[j]==0 && dis[j] < mindis) {
					minIndex = j;
					mindis = dis[j];
				}
			}
			vis[minIndex] = 1;
			update(minIndex);//继续更新
		}
		
		System.out.println(Arrays.toString(dis));
	}
	/**
	 * 以index顶点向下查找!!!以起点start到index附近的邻接结点的最短路径!!!
	 * @param index
	 */
	public static void update(int index) {
		vis[index] = 1;//index标记为已访问
		int len= 0;//len:从start顶点到index顶点的距离+上从index再到i顶点的距离
		//循环遍历每个邻接结点顶点,找到真正意义上的最短路径
		for (int i = 0; i < matrix[index].length; i++) {
			//记录从start顶点到index顶点的距离+上从index再到i顶点的距离
			len = dis[index] + matrix[index][i];
			//将dis[i] 即从start直接到i 的距离 与len进行比较 
			if(vis[i] == 0 && len < dis[i]) {
				dis[i] = len;//更新最短路径
				pre[i] = index;//更新前置顶点
			}
		}
	}
	/**
	 * 初始化邻接矩阵
	 * @param matrix
	 */
	public static void chushihua(int[][] matrix) {
		final int N = 9999;
		matrix[0]=new int[]{N,5,7,N,N,N,2};
		matrix[1]=new int[]{5,N,N,9,N,N,3};
		matrix[2]=new int[]{7,N,N,N,8,N,N};
		matrix[3]=new int[]{N,9,N,N,N,4,N};
		matrix[4]=new int[]{N,N,8,N,N,5,4};
		matrix[5]=new int[]{N,N,N,4,5,N,6};
		matrix[6]=new int[]{2,3,N,N,4,6,N};
	}
}

 

 

 

추천

출처blog.csdn.net/qq_52360069/article/details/123686090