티스토리 뷰

반응형






import java.util.Vector;


public class Dijkstra {



int n = 0; // 정점의 갯수

final static int m = 30000; // 선이 없는 곳... 무지 큰수로 설정

int data[][]; // 전체 지도 데이타

boolean visit[]; // 방문지 확인

int dis[]; // 시작점 부터의 거리

int prev[]; // 도착점 전의 정점 저장

int s,e;  // 시작점과 끝점 저장

int stack[]; // 시작점부터 끝점까지의 순서 저장

Vector<Integer> stackV;


public void init(int dataI[][]) // 다익스트라(Dijkstra) 알고리즘/단일 점에 따라 최단거리

{

data=dataI;

n = data.length;


dis = new int[n];

visit = new boolean[n];

prev = new int[n];

stack = new int[n];

stackV=new Vector<Integer>();

}

public int theLeastDistance()

{

return dis[e-1];

}

public void start(int start,int end)

{

System.out.println("==========================================================");

System.out.println("Dijkstra start");

System.out.println("startPoint: "+start);

System.out.println("endPoint: "+end);

System.out.println("===========================================================");

s=start;

e=end;

int k=0;

int min=0;


for (int i = 0; i < n; i++) { /* 초기화 */

dis[i] = m;

prev[i] = 0;

visit[i] = false;

}


dis[s - 1] = 0; /* 시작점의 거리는 0 */

 

for (int i = 0; i < n; i++) {

min = m;

for (int j = 0; j < n; j++) { /* 정점의 수만큼 반복 */

if (visit[j] == false && dis[j] < min) { /* 확인하지 않고 거리가 짧은 정점을 찾음 */

k = j;

min = dis[j];

}

}

visit[k] = true; /* 해당 정점 확인 체크 */    

if (min == m)break; /* 연결된 곳이 없으면 종료 */

/****

* I -> J 보다 I -> K -> J의

* 거리가 더 작으면

* 갱신

****/

for (int j = 0; j < n; j++) {

if (dis[k] + data[k][j] < dis[j]) {

dis[j] = dis[k] + data[k][j]; /* 최단거리 저장*/

prev[j] = k; /* J로 가기 위해서는 K를 거쳐야 함 */

}

}

}

// nowLeastDistance();   //콘솔에서 최단거리 출력

inverseFind(); // 콘솔에서 최단 경로 출력

}

/**** 최단 거리 출력 ****/

public void nowLeastDistance()

{

System.out.printf("최단거리:  %10d       ", dis[e - 1]);

}

/**** 최단 경로를 저장 ****/

public void inverseFind()

{

int tmp = 0;

int top = -1;

tmp = e - 1;

while (true) {

stack[++top] = tmp + 1;

if (tmp == s - 1)break; /* 시작점에 이르렀으면 종료 */

tmp = prev[tmp];

}

/* 역추적 결과 출력 */

stackV.removeAllElements();

for (int i = top; i > -1; i--) {

//System.out.printf("%d", stack[i]);

stackV.add(stack[i]);

//if (i != 0)System.out.printf(" -> ");

}

//System.out.printf("\n");

}

public Vector<Integer> getStack()

{

return stackV;

}



public static void main(String[] args) {

int m=30000;

int [][]data = new int[][] {

{ 0, 2, m, m, m, 3, m, m },

{ 2, 0, 4, 1, m, m, m, m },

{ m, 4, 0, m, m, m, 3, m },

{ m, 1, m, 0, 3, m, 2, m },

{ m, m, 3, 3, 0, m, m, 4 },

{ 3, m, m, m, m, 0, 6, m },

{ m, m, m, 2, m, 6, 0, 4 },

{ m, m, m, m, 4, m, 4, 0 } };

Dijkstra k=new Dijkstra();

k.init(data);

k.start(1,3);

}


}


[출처] http://nsyang-textcube.blogspot.kr/2009/06/%EC%B5%9C%EB%8B%A8%EA%B1%B0%EB%A6%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98dijkstra.html


반응형

'프로그램' 카테고리의 다른 글

SWT 프로그램 기초  (0) 2014.02.11
다익스트라(Dijkstra) 알고리즘  (0) 2014.02.08
자바 최단경로 알고리즘  (0) 2014.02.07
자바스크립트 replace  (12) 2014.02.07
전자정부프레임웍에서 ibatis 쿼리 로그 생성  (0) 2014.02.05
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함