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;
}
}
}
}
}
CCF行车路线-Java
猜你喜欢
转载自blog.csdn.net/kidchildcsdn/article/details/81671476
今日推荐
周排行