MyDijkstraTest

原创 2015年07月06日 18:16:52
public class MyDijkstraTest {

	/**
	 * @param args
	 */
	public static int U = 99999999;

	public static void main(String[] args) {
		int[][] graph = { { 0, 50, U, 80, U }, { U, 0, 60, 90, U },
				{ U, U, 0, U, 40 }, { U, U, 20, 0, 70 }, { U, 50, U, U, 0 } };
		int start = 0;
		Path2Len[] path2LenArray = getShorestPath(graph, start);
		for (int i = 0; i < path2LenArray.length; i++) {
			Path2Len path2Len = path2LenArray[i];
			int lastVetrex = path2Len.lastVetrex;
			System.out.print("from " + start + " to " + i + " length:"
					+ path2Len.len + ", path: " + i + " <-- " + lastVetrex);

			while (lastVetrex != start) {
				lastVetrex = path2LenArray[lastVetrex].lastVetrex;
				System.out.print(" <--" + lastVetrex);

			}
			System.out.println();
		}

	}

	public static Path2Len[] getShorestPath(int[][] graph, int start) {
		int N = graph.length;
		Path2Len[] path2LenArray = new Path2Len[N];
		boolean[] visited = new boolean[N];
		for (int i = 0; i < N; i++) {
			Path2Len path2Len = new Path2Len();
			path2Len.lastVetrex = start;
			path2Len.len = graph[start][i];
			path2LenArray[i] = path2Len;
			visited[i] = false;
			System.out.println("init " + start + " --> " + i + ":    " + path2Len.len);
		}

		visited[start] = true;

		for (int count = 0; count < N - 1; count++) {
			int minIndex = -1;
			int minLen = U;
			for (int i = 0; i < N; i++) {
				if (!visited[i] && path2LenArray[i].len < minLen) {
					minLen = path2LenArray[i].len;
					minIndex = i;
				}
			}
			if (minLen == U) {
				break;
			}
			visited[minIndex] = true;

			for (int i = 0; i < N; i++) {
				if (!visited[i]
						&& graph[minIndex][i] < U
						&& path2LenArray[minIndex].len + graph[minIndex][i] < path2LenArray[i].len) {
					path2LenArray[i].len = path2LenArray[minIndex].len
							+ graph[minIndex][i];
					path2LenArray[i].lastVetrex = minIndex;
					System.out.println("update " + start + " --> " + i + " via "
							+ minIndex + ":   " + path2LenArray[i].len);
				}
			}
		}

		return path2LenArray;
	}

}

class Path2Len {
	public int lastVetrex;
	public int len;
}


输出:

init 0 --> 0:    0
init 0 --> 1:    50
init 0 --> 2:    99999999
init 0 --> 3:    80
init 0 --> 4:    99999999
update 0 --> 2 via 1:   110
update 0 --> 2 via 3:   100
update 0 --> 4 via 3:   150
update 0 --> 4 via 2:   140
from 0 to 0 length:0, path: 0 <-- 0
from 0 to 1 length:50, path: 1 <-- 0
from 0 to 2 length:100, path: 2 <-- 3 <--0
from 0 to 3 length:80, path: 3 <-- 0
from 0 to 4 length:140, path: 4 <-- 2 <--3 <--0


内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MyDijkstraTest
举报原因:
原因补充:

(最多只允许输入30个字)