解法一:DFS
import java.io.*;import java.util.*;public class Main { private static int capacity, N, target, M; private static int[][] map; private static final int INF = 0x3f3f3f3f; private static boolean[] isVisited; private static int[] bikes; private static int minTime, minSend, minBack; private static List<Integer> path; public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); capacity = (int) in.nval; in.nextToken(); N = (int) in.nval + 1; in.nextToken(); target = (int) in.nval; in.nextToken(); M = (int) in.nval; map = new int[N][N]; for (int[] arr : map) { Arrays.fill(arr, INF); } bikes = new int[N]; for (int i = 1; i < N; ++i) { in.nextToken(); bikes[i] = (int) in.nval; } int u, v, val; while (M-- > 0) { in.nextToken(); u = (int) in.nval; in.nextToken(); v = (int) in.nval; in.nextToken(); val = (int) in.nval; map[u][v] = val; map[v][u] = val; } isVisited = new boolean[N]; Arrays.fill(isVisited, false); isVisited[0] = true; minBack = minSend = minTime = INF; path = new ArrayList<>(); List<Integer> cities = new LinkedList<>(); cities.add(0); dfs(0, 0, cities); out.print(minSend); out.print(" " + path.get(0)); for (int i = 1; i < path.size(); ++i) { out.print("->" + path.get(i)); } out.println(" " + minBack); out.flush(); } private static void dfs(int index, int time, List<Integer> cities) { // 剪枝 if (time > minTime) { return; } if (index == target) { int send = 0; int bikeSum = 0; for (int i = 1; i < cities.size(); ++i) { bikeSum += bikes[cities.get(i)]; send = Math.max(send, i * capacity / 2 - bikeSum); } int back = Math.max(send + bikeSum - (cities.size() - 1) * capacity / 2,0); if (time < minTime || send < minSend || send == minSend && back < minBack) { path.clear(); path.addAll(cities); minTime = time; minSend = send; minBack = back; } } else { for (int i = 1; i < N; ++i) { if (isVisited[i] || map[index][i] == INF) { continue; } isVisited[i] = true; cities.add(i); dfs(i, time + map[index][i], cities); cities.remove(cities.size() - 1); isVisited[i] = false; } } }}