Untitled
unknown
plain_text
2 years ago
3.7 kB
7
Indexable
import java.util.Scanner;
public class test {
static int N, M, K;
static int[] DiemVs;
static int[][] matrix;
static int[][] mtk;
static int[][] ChiPhi;
static boolean[] visited;
static int ans;
static void Dijkstra(int n) {
visited[n] = true;
ChiPhi[n][n] = 0;
for (int i = 1; i <= N; i++) {
int minDist = Integer.MAX_VALUE;
int minVertex = -1;
for (int j = 1; j <= N; j++) {
if (!visited[j] && ChiPhi[n][j] < minDist) {
minDist = ChiPhi[n][j];
minVertex = j;
}
}
if (minVertex == -1)
break;
visited[minVertex] = true;
for (int j = 1; j <= N; j++) {
if (!visited[j] && matrix[minVertex][j] != 999999) {
int newDist = minDist + matrix[minVertex][j];
if (newDist < ChiPhi[n][j]) {
ChiPhi[n][j] = newDist;
}
}
}
}
}
static void Backtrack(int vertex, int numVerticesVisited, int cost) {
if (numVerticesVisited == K) {
if (ChiPhi[vertex][1] != 999999) {
if (cost + ChiPhi[vertex][1] < ans) {
ans = cost + ChiPhi[vertex][1];
}
}
return;
}
if (cost > ans) {
return;
}
for (int i = 0; i <= K; i++) {
int nextVertex = DiemVs[i];
if (!visited[nextVertex] && ChiPhi[vertex][nextVertex] != 999999) {
visited[nextVertex] = true;
Backtrack(nextVertex, numVerticesVisited + 1, cost + ChiPhi[vertex][nextVertex]);
visited[nextVertex] = false;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tc = sc.nextInt();
for (int t = 1; t <= tc; t++) {
N = sc.nextInt();
M = sc.nextInt();
K = sc.nextInt();
DiemVs = new int[K + 1];
matrix = new int[N + 1][N + 1];
mtk = new int[N + 1][N + 1];
ChiPhi = new int[N + 1][N + 1];
visited = new boolean[N + 1];
ans = Integer.MAX_VALUE;
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
matrix[i][j] = 999999;
ChiPhi[i][j] = 999999;
}
}
for (int i = 1; i <= K; i++) {
DiemVs[i] = sc.nextInt();
}
DiemVs[0] = 1;
for (int i = 0; i < M; i++) {
int r = sc.nextInt();
int c = sc.nextInt
int money = sc.nextInt();
matrix[r][c] = money;
mtk[r][i] = c;
}
for (int i = 0; i <= K; i++) {
Dijkstra(DiemVs[i]);
}
visited[1] = true;
Backtrack(1, 0, 0);
System.out.println("Case #" + t);
if (ans != Integer.MAX_VALUE) {
System.out.println(ans);
} else {
System.out.println(-1);
}
System.out.println();
}
}
static class Node implements Comparable<Node> {
int vertex;
int distance;
public Node(int vertex, int distance) {
this.vertex = vertex;
this.distance = distance;
}
@Override
public int compareTo(Node other) {
return Integer.compare(this.distance, other.distance);
}
}
}
Editor is loading...