解法一: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;
}
}
}
}