Untitled
unknown
plain_text
2 years ago
4.2 kB
4
Indexable
package LuyenDe; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner; public class Solution { static int T, n, tuyenDuong, diaDiemCanDiQua, valueX, valueY; static long res, resCur; static long[][] a = new long[1001][1001]; static long[][] matrankc = new long[1001][1001]; static int[] dxDiaDiemCanQua = new int[1001]; static boolean[] visited2 = new boolean[1001]; // danh cho tt dijkstra static long[] distance = new long[1001]; static boolean[] visited = new boolean[1001]; static long inf = Long.MAX_VALUE; public static void resetMaTran() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = 0; } } } public static void resetVisited() { for (int i = 1; i <= n; i++) { visited[i] = false; } } public static void resetVisited2() { for (int i = 1; i <= n; i++) { visited2[i] = false; } } public static void inMaTranKc() { System.out.println(); for (int i = 0; i <= diaDiemCanDiQua; i++) { for (int j = 0; j <= diaDiemCanDiQua; j++) { System.out.print(matrankc[i][j] + " "); } System.out.println(); } } public static void inMaTranInput() { System.out.println(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } } public static void dijkstra(int start) { resetVisited(); // khoi tao nao int x_Start = start; for (int i = 1; i <= n; i++) { distance[i] = inf; } int count = 0; distance[x_Start] = 0; while (count <= n) { // buoc 2 chon dinh de xet // va co khoang cach min nhat int dangXet = 0; long minDist = inf; for (int i = 1; i <= n; i++) { if (!visited[i] && distance[i] < minDist) { minDist = distance[i]; dangXet = i; } } // // if (dangXet==stop) { // return distance[dangXet]; // } // buoc 3 tu dinh dang xet update khoang cach for (int i = 1; i <= n; i++) { if (!visited[i] && a[dangXet][i] != 0) { long newDistance = (distance[dangXet] + a[dangXet][i]); if (newDistance < distance[i]) { distance[i] = newDistance; } } } visited[dangXet] = true; count++; } } public static void bt(int index, long sum, int count) { // dieu kien dung if (count == diaDiemCanDiQua) { if (sum + matrankc[index][0] < res) { res = sum + matrankc[index][0]; } return; } if (sum + matrankc[index][1] > res) { return; } // xu ly for (int i = 0; i <= diaDiemCanDiQua; i++) { if (!visited2[dxDiaDiemCanQua[i]]) { visited2[dxDiaDiemCanQua[i]] = true; bt(i, sum + matrankc[index][i], count + 1); visited2[dxDiaDiemCanQua[i]] = false; } } } public static void main(String[] args) { try { System.setIn(new FileInputStream("input")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Scanner scanner = new Scanner(System.in); T = scanner.nextInt(); for (int tc = 1; tc <= T; tc++) { // input n = scanner.nextInt(); tuyenDuong = scanner.nextInt(); diaDiemCanDiQua = scanner.nextInt(); resetMaTran(); dxDiaDiemCanQua[0] = 1; for (int i = 1; i <= diaDiemCanDiQua; i++) { dxDiaDiemCanQua[i] = scanner.nextInt(); } for (int i = 1; i <= tuyenDuong; i++) { valueX = scanner.nextInt(); valueY = scanner.nextInt(); a[valueX][valueY] = scanner.nextInt(); } ///// xu ly // tao ma tran khoang cach // inMaTranInput(); for (int i = 0; i <= diaDiemCanDiQua; i++) { dijkstra(dxDiaDiemCanQua[i]); for (int j = 0; j <= diaDiemCanDiQua; j++) { if (i == j) { matrankc[i][j] = 0; } matrankc[i][j] = distance[dxDiaDiemCanQua[j]]; } } resetVisited2(); // inMaTranKc(); res = 999999999; visited2[dxDiaDiemCanQua[0]] = true; bt(0, 0, 0); System.out.println("Case #" + tc); System.out.println(res); System.out.println(); } } }
Editor is loading...