import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String[] arr = in.nextLine().split(" ");
int start = arr[0].charAt(0) - 'a';
int end = arr[1].charAt(0) - 'a';
String[] arr2 = new String[100];
int i = 0;
while (true) {
String str = in.nextLine();
if (str.equals("0000")) {
break;
}
arr2[i++] = str;
}
int[][] matrix = new int[n][n];
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
matrix[j][k] = Integer.MAX_VALUE;
}
}
for (int j = 0; j < n; j++) {
matrix[j][j] = 0;
}
for (int j = 0; j < i; j++) {
String str = arr2[j];
int a = str.charAt(0) - 'a';
int b = str.charAt(2) - 'a';
int c = Integer.parseInt(str.substring(4,5));
matrix[a][b] = Math.min(matrix[a][b], c);
matrix[b][a] = Math.min(matrix[b][a], c);
}
// Floyd-Warshall算法计算最短路径
int[][] prev = new int[n][n];
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if (matrix[j][k] != Integer.MAX_VALUE && j != k) {
prev[j][k] = j;
} else {
prev[j][k] = -1;
}
}
}
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
for (int l = 0; l < n; l++) {
if (matrix[k][j] != Integer.MAX_VALUE && matrix[j][l] != Integer.MAX_VALUE) {
if (matrix[k][l] > matrix[k][j] + matrix[j][l]) {
matrix[k][l] = matrix[k][j] + matrix[j][l];
prev[k][l] = prev[j][l];
}
}
}
}
}
// 如果没有路径
if (matrix[start][end] == Integer.MAX_VALUE) {
System.out.println("No Path");
return;
}
// 回溯路径
List<Character> path = new ArrayList<>();
int current = end;
while (current != start) {
path.add((char) (current + 'a'));
current = prev[start][current];
if (current == -1) {
System.out.println("No Path");
return;
}
}
path.add((char) (start + 'a'));
Collections.reverse(path);
// 输出路径
StringBuilder sb = new StringBuilder();
for (int j = 0; j < path.size(); j++) {
sb.append(path.get(j));
if (j != path.size() - 1) {
sb.append(" ");
}
}
System.out.print(sb.toString().trim());
System.out.println();
}
} |