CCF行车路线-Java

import java.util.Scanner;

public class Route {

	static Scanner sc;
	static int[][] edge;
	static int m, n;
	static boolean[][] flag;
	static boolean isVisited[];
	static int INF = Integer.MAX_VALUE;
	static int dist1[];
	
	public static void main(String[] args) {
		
		
		sc = new Scanner(System.in);
		n = sc.nextInt(); // 顶点个数
		m = sc.nextInt(); // 边的条数
		sc.nextLine();
		edge = new int[n + 1][n + 1];
		dist1 = new int[n + 1];
		
		flag = new boolean[n + 1][n + 1];
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				if (i == j)
					edge[i][j] = 0;
				else
					edge[i][j] = INF;
		for (int i = 0; i < m; i++) {
			String temp = sc.nextLine() + " ";
			String[] cmd = temp.split(" ");
			if (Integer.parseInt(cmd[0]) == 1)
				flag[Integer.parseInt(cmd[1])][Integer.parseInt(cmd[2])] = true;
			edge[Integer.parseInt(cmd[1])][Integer.parseInt(cmd[2])] = Integer.parseInt(cmd[3]);
		}

		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) {
				edge[j][i] = edge[i][j];
				flag[j][i] = flag[i][j];
			}	
		dis(1, dist1);
		System.out.println(dist1[n]);
		
	}

	public static void dis(int start, int[] dist1) {
		isVisited = new boolean[n + 1];
		for (int i = 1; i <= n; i++) {
			isVisited[i] = false;
			dist1[i] = edge[start][i];
		}
		isVisited[start] = true;
		dist1[start] = 0;
		int k = 0;
		
		int result = 0;
		int prev = start;
		boolean check = false;
		int premin = 0;
		for (int i = 0; i < n - 1; i++) {
			int min = INF;
			for (int j = 1; j <= n; j++) {
				if (isVisited[j] == false && dist1[j] < min) {
					if (flag[prev][j] == true) {  //如果是大道
						result = result + edge[prev][j];
						if (check == true) {    //如果是连续的大道
							min = result * result;
						} else {  //如果是不连续的大道
							min = premin + result * result;
						}
						check = true;
					} else {
						result = 0;
						check = false;
						min = dist1[j];
					}
					k = j;
				}

			}
			premin = min;
			isVisited[k] = true;
			for (int j = 1; j <= n; j++) {
				int temp = INF;
				if (isVisited[j] == false) {
					if (edge[k][j] != INF) {
						if (flag[k][j] == true) { // 表示大道
							if (check == true) {  //表示连续的大道
								temp = (result + edge[k][j]) * (result + edge[k][j]);
							} else {
								temp = min + edge[k][j] * edge[k][j];
							}

						} else { // 表示小道
							temp = min + edge[k][j];
						}
					}
				}
				if (isVisited[j] == false && (temp < dist1[j])) {
					dist1[j] = temp;
					prev = k;
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/kidchildcsdn/article/details/81671476