解法一:DFS

  1. import java.io.*;
  2. import java.util.*;
  3. public class Main {
  4. private static int capacity, N, target, M;
  5. private static int[][] map;
  6. private static final int INF = 0x3f3f3f3f;
  7. private static boolean[] isVisited;
  8. private static int[] bikes;
  9. private static int minTime, minSend, minBack;
  10. private static List<Integer> path;
  11. public static void main(String[] args) throws IOException {
  12. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  13. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  14. in.nextToken();
  15. capacity = (int) in.nval;
  16. in.nextToken();
  17. N = (int) in.nval + 1;
  18. in.nextToken();
  19. target = (int) in.nval;
  20. in.nextToken();
  21. M = (int) in.nval;
  22. map = new int[N][N];
  23. for (int[] arr : map) {
  24. Arrays.fill(arr, INF);
  25. }
  26. bikes = new int[N];
  27. for (int i = 1; i < N; ++i) {
  28. in.nextToken();
  29. bikes[i] = (int) in.nval;
  30. }
  31. int u, v, val;
  32. while (M-- > 0) {
  33. in.nextToken();
  34. u = (int) in.nval;
  35. in.nextToken();
  36. v = (int) in.nval;
  37. in.nextToken();
  38. val = (int) in.nval;
  39. map[u][v] = val;
  40. map[v][u] = val;
  41. }
  42. isVisited = new boolean[N];
  43. Arrays.fill(isVisited, false);
  44. isVisited[0] = true;
  45. minBack = minSend = minTime = INF;
  46. path = new ArrayList<>();
  47. List<Integer> cities = new LinkedList<>();
  48. cities.add(0);
  49. dfs(0, 0, cities);
  50. out.print(minSend);
  51. out.print(" " + path.get(0));
  52. for (int i = 1; i < path.size(); ++i) {
  53. out.print("->" + path.get(i));
  54. }
  55. out.println(" " + minBack);
  56. out.flush();
  57. }
  58. private static void dfs(int index, int time, List<Integer> cities) {
  59. // 剪枝
  60. if (time > minTime) {
  61. return;
  62. }
  63. if (index == target) {
  64. int send = 0;
  65. int bikeSum = 0;
  66. for (int i = 1; i < cities.size(); ++i) {
  67. bikeSum += bikes[cities.get(i)];
  68. send = Math.max(send, i * capacity / 2 - bikeSum);
  69. }
  70. int back = Math.max(send + bikeSum - (cities.size() - 1) * capacity / 2,0);
  71. if (time < minTime || send < minSend || send == minSend && back < minBack) {
  72. path.clear();
  73. path.addAll(cities);
  74. minTime = time;
  75. minSend = send;
  76. minBack = back;
  77. }
  78. } else {
  79. for (int i = 1; i < N; ++i) {
  80. if (isVisited[i] || map[index][i] == INF) {
  81. continue;
  82. }
  83. isVisited[i] = true;
  84. cities.add(i);
  85. dfs(i, time + map[index][i], cities);
  86. cities.remove(cities.size() - 1);
  87. isVisited[i] = false;
  88. }
  89. }
  90. }
  91. }