[Java] PAT甲级 1018 Public Bike Management

代码可以全部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;
			}
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值