using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test_Algo : MonoBehaviour { private static int INF = 1000000000; //무한대를 표현하기 위해 int 형은 21억정도의 양수의 값을 가질수 있기때문에 private static int number = 6; //정점의 갯수 public GameObject gss; bool[] v = new bool[6]; //방문한 노드 int[] d = new int[6]; //최단 거리 private GameObject ga; //x좌표y 좌표 int[,] a = new int[6, 6] { //즉 distance 값 {0,4,6,5,INF,INF}, {4,0,INF,3,3,INF}, {6,INF,0,5,INF,7}, {5,3,5,0,INF,3}, {INF,3,INF,INF,0,6}, {INF,INF,7,3,6,0},}; int[] x = new int[5]; int[] z = new int[5]; //가장 비용이 적은 노드를 구해옴 public void Start() { // x 와 z 의 Transform 위치값 x[0] = 0; x[1] = 0; x[2] = 6; x[3] = 3; x[4] = 7; x[5] = 6; z[0] = 0; z[1] = 4; z[2] = 0; z[3] = 4; z[4] = 0; z[5] = 7; dijkstra(0); // for (int i = 0; i < number; i++) { Debug.Log(d[i]); } } int getSmallIndex() { int min = INF; int index = 0; //선형탐색 for (int i = 0; i < number; i++) { //방문하지 않은 노드 중에서 현재 최소값보다 더 작은 거리가 존재한다면 if (d[i] < min && !v[i]) { //그 값으로 값을 갱신해준다,. min = d[i]; //그리고 그때의 위치를 기억할수 있게 한다. index = i; } } return index; } // 다익스트라를 수행하는 함수. 시작 위치를 물어본다. void dijkstra(int start) { for (int i = 0; i < number; i++) { //d는 결과 적으로 가지는 최소비용을 담는 배열 d[i] = a[start,i]; //모든 경로까지의 비용을 담아줌 } v[start] = true; //시작점을 방문을 했다고 알려줌 for (int i = 0; i < number - 2; i++) { int current = getSmallIndex(); //현재 방문하지 않는 노드 중에서 빠르게 도착할수 있는 비용을 가지는 노드 v[current] = true; //노드를 방문 처리 해줌 for (int j = 0; j < 6; j++) { //하나씩 확인 해보면서 그노드를 방문하지 않았다면, if (!v[j]) { //d[current]= 노드까지의 최소비용에서, a[current][j]=노드를 거쳐서, if (d[current] + a[current,j] < d[j]) { //d[j]값을 더 작은 값으로 갱신한다. d[j] = d[current] + a[current,j]; } } } } } }