代码可以全部AC。我简单说一下自己的思路,就是使用dfs递归算法对图进行遍历,dfs有五个参数,分别为开始结点,总共的时间,字符串拼接的路径,send和back,当总时间大于最小时间该部分跳出,最后结点为目标结点时,更新总时间为最小,如果时间相等,则先比较send,再比较back。
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int capacity;
static int stations;
static int roads;
static int target;
static long mintime = Long.MAX_VALUE;
static int bikes;
static int send;
static int back;
static String minpath;
static int[] current;
static int[][] map;
static boolean[][] visit;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] aLine = bf.readLine().split(" ");
capacity = Integer.parseInt(aLine[0]);
stations = Integer.parseInt(aLine[1]);
target = Integer.parseInt(aLine[2]);
roads = Integer.parseInt(aLine[3]);
map = new int[stations + 1][stations + 1];
visit = new boolean[stations + 1][stations + 1];
current = new int[stations + 1];
String[] bLine = bf.readLine().split(" ");
for (int i = 1; i <= stations; i++) {
current[i] = Integer.parseInt(bLine[i - 1]);
}
for (int i = 0; i < roads; i++) {
String[] cLine = bf.readLine().split(" ");
int a1 = Integer.parseInt(cLine[0]);
int a2 = Integer.parseInt(cLine[1]);
int time = Integer.parseInt(cLine[2]);
map[a1][a2] = map[a2][a1] = time;
}
dfs(0, 0, "0", 0, 0);
System.out.println(send + " " + minpath + " " + back);
}
static void dfs(int station, int time, String path, int i_send, int i_back) {
if (station == target) {
if (time < mintime) {
mintime = time;
minpath = path;
send = i_send;
back = i_back;
// time相等,先比较send再比较back
} else if (time == mintime) {
if (i_send == send ? i_back < back : i_send < send) {
minpath = path;
send = i_send;
back = i_back;
}
}
return;
}
if (time > mintime)
return;
for (int i = 0; i <= stations; i++) {
if (map[station][i] != 0 && visit[station][i] == false) {
visit[station][i] = visit[i][station] = true;
int d_back = i_back;
int d_send = i_send;
if (current[i] > capacity / 2) {
d_back = i_back + current[i] - capacity / 2;
} else if (current[i] < capacity / 2) {
if (i_back >= capacity / 2 - current[i]) {
d_back = i_back - capacity / 2 + current[i];
} else {
d_send = i_send + capacity / 2 - current[i] - i_back;
d_back = 0;
}
}
dfs(i, time + map[station][i], path + "->" + i, d_send, d_back);
visit[station][i] = visit[i][station] = false;
}
}
}
}