본문 바로가기

학부_대학원/자료구조

다익스트라 알고리즘[Dijkstra Algorithm]

SMALL

Shortest Path Problem 문제를 해결하기 위한 알고리즘


각 edge에 가중치를 두는 weighted Graph에서 사용


Connected Graph에서 사용


가중치가 음수가 없어야함. 


어떤 vertex를 시작점으로 하여 다음 vertex를 연결하는 edge의 가중치를 계산하여서


가장 작은 가중치를 가지는 경로를 탐색


가중치란 


평균치(:평균값)를 산출할 때 각 개별치()에 부여되는 중요도.


그런데 상황마다 다를것이다.


예를 들어 가난한 사람과 부자인 사람을 생각해보자


부자인 사람은 시간이 더 가치있다고 생각 하기때문에 edge를 통과하는데 걸리는


시간이 작은것에 더 높은 가중치를 둘것이다.


하지만 가난한 대학생의 경우 시간은 많지만 돈이 없기때문에 edge를 통과하는데


소비되는 돈의 양을 줄이는데 더 높은 가중치를 둘것이다.



코드

출처[http://kaspyx.kr/64]


생각하면서 너무 많이 헷갈려서 초기화 값부터 조금씩 찾아갔다...

어렵다..

###############################################################

#include "stdio.h"
#include "stdlib.h"

#define INF 9999
#define N 5
void Dij();



//배열 생성
int Arr[N + 1][N + 1]
= {
	//A  B  C  D  E  F
	{ 0, 0, 0, 0, 0, 0 },//A
	{ 0, 0, 0, 0, 0, 0 },//B
	{ 0, 0, 0, 0, 0, 0 },//C
	{ 0, 0, 0, 0, 0, 0 },//D
	{ 0, 0, 0, 0, 0, 0 },//E
	{ 0, 0, 0, 0, 0, 0 } //F
};


int main()
{
	Dij();

	system("pause");
}
void Dij()
{	int index = 0;
	int index_2 = 0;
	int min = 0;
	int next_node = 0;

	//초기화
	for (index = 0; index < N + 1; index++)
	{
		for (index_2 = 0; index_2 < N + 1; index_2++)
		{
			Arr[index][index_2] = INF;
		}
	}

	//연결된 방향 노드 설정
	Arr[0][1] = 20; //a -> b
	Arr[0][3] = 30; //a -> d
	Arr[1][2] = 20; //b -> c
	Arr[1][4] = 40; //b -> e
	Arr[2][5] = 20; //c -> f
	Arr[3][2] = 20; //d -> c
	Arr[3][5] = 30; //d -> f
	Arr[4][5] = 10; //e -> f
	Arr[3][4] = 20; //d -> e
	///////////////////////////////////////////////////////
	//D[Vi] 시적점 v1부터 꼭짓점 Vi까지의 최단 경로
	//a를 시작점이면 
	//a를 시작점으로 하여서 각 꼭짓점까지의 최단경로
	//Distance 초기 vertex부터 Vn[a...f]까지 최단 경로
	int Distance[N + 1] = { 0 };

	for (index = 1; index < N + 1; index++)
	{
		Distance[index] = INF;
	}
	//이미 방문한 정점들을 표시함
	//그리고 최근 경신된 정점에서 다시 다음 정점 거리를 계산한다.
	int Visit[N + 1] = { 0 };

	//가장 가까운 점을 표현하는ㄷ ㅔ사용
	int Shortest_Node = 0;

	for (index = 1; index < N + 1; index++)
	{
		//최솟값을 찾기위한 초기화
		min = INF;

		for (index_2 = 0; index_2 < N + 1; index_2++)
		{
			//1. 먼저 방문하지 않은 노트을 선택
			//2. 가장 가까운 노드를 선택한다.

			//D[1] = D[0] + 0->1 20
			//D[2] = D[0] + 0->2 INF
			//D[3] = D[0] + 0->3 30
			//D[4] = D[0] + 0->4 INF
			//D[5] = D[0] + 0->5 INF
			//여기서 가장 짧은 놈을 선택
			if (Visit[index_2] == 0 // 방문하지 않는 노드를 확인
				&& min > Distance[index_2]
				)
			{
				min = Distance[index_2];
				Shortest_Node = index_2;
			}
		}

		//가장 가까운 정점을 방문했다는 표시를 함.
		Visit[Shortest_Node] = 1;

		//현재 머물고 있는 Node가 Shortest Node임
		//해당 반복문에서는 다음 거리까지의 총 거리를 구하는 역할임.
		//D[1] = D[0] + 0->1 20
		//D[2] = D[0] + 0->2 INF
		//D[3] = D[0] + 0->3 30
		//D[4] = D[0] + 0->4 INF
		//D[5] = D[0] + 0->5 INF
		////////////////////////////
		//1이선택 [B]
		//D[0] 0 > D[1] 20 + 1->0 INF
		//D[1] 20 =  D[1] 20 + 1->1 0 
		//D[2] INF  D[1] 20  + 1->2 40
		for (index_2 = 1; index_2 < N + 1; index_2++)
		{
			if (Distance[index_2] > Distance[Shortest_Node] + Arr[Shortest_Node][index_2])
			{
				Distance[index_2] = Distance[Shortest_Node] + Arr[Shortest_Node][index_2];
			}
		}
	}
	printf("%d \n", Distance[5]);
}

	
	





LIST

'학부_대학원 > 자료구조' 카테고리의 다른 글

자료구조 - 원형 연결 리스트  (0) 2016.08.01
연결 자료구조[단순 연결 리스트]  (0) 2016.07.29
Tree [트리]  (0) 2016.07.28
선형 리스트[Linear List]  (0) 2016.07.28
Graph[그래프]  (0) 2016.07.26