输入输出样例
样例1
输入
5 101 21 31 41 52 32 42 53 43 54 51 271 1 12 1 23 1 34 1 45 1 51 12 13 14 15 11 22 23 24 25 21 10 102 11 91 112 113 114 115 111 122 123 124 125 12
输出
2 0 12 0 22 0 32 0 42 0 52 0 12 0 12 0 12 0 12 0 13 0 1 104 0 1 10 93 0 1 103 0 1 103 0 1 104 0 1 10 94 0 1 10 94 0 1 10 94 0 1 10 94 0 1 10 9
样例2
输入
15 131 22 33 44 51 66 77 88 91 1010 1111 1212 1314 156 281 1 11 2 21 62 713 79 75 73 148 145 1411 149 255 2513 259 29 35 29 413 29 51 532 59 62 591 10003 10008 10009 100010 100013 100014 100015 1000
输出
3 0 1 22 0 11 01 01 03 0 1 21 01 03 0 1 22 0 12 0 12 0 14 0 1 2 35 0 1 2 3 65 0 1 2 3 65 0 1 2 3 65 0 1 2 3 65 0 1 2 3 65 0 1 2 3 65 0 1 2 3 61 01 0
题解一
BFS模拟。80分。
参考:https://www.mscto.com/blockchain/238982.html
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String[] strs = reader.readLine().split(" ");int n = Integer.parseInt(strs[0]);int m = Integer.parseInt(strs[1]);Node[] nodes = new Node[n + 1];for (int i = 0; i <= n; ++i) {nodes[i] = new Node(n, i);}for (int i = 0, u, v; i < m; ++i) {strs = reader.readLine().split(" ");u = Integer.parseInt(strs[0]);v = Integer.parseInt(strs[1]);nodes[u].partners.add(nodes[v]);nodes[v].partners.add(nodes[u]);}strs = reader.readLine().split(" ");int t = Integer.parseInt(strs[0]);int k = Integer.parseInt(strs[1]);// 更新消息队列Queue<Message> queue = new LinkedList<>();for (int i = 0, a, b, c; i < k; ++i) {strs = reader.readLine().split(" ");a = Integer.parseInt(strs[0]);b = Integer.parseInt(strs[1]);while ((!queue.isEmpty()) && (queue.peek().time <= b)) {Message message = queue.poll();if (update(message.srcLink, message.dst)) {for (Node node : message.dst.partners) {queue.offer(new Message(message.dst.link, node, message.time + t));}}}if (strs.length == 2) {System.out.print(nodes[a].link.size());for (int block : nodes[a].link) {System.out.print(" " + block);}System.out.println();} else {c = Integer.parseInt(strs[2]);nodes[a].link.add(c);for (Node node : nodes[a].partners) {queue.offer(new Message(nodes[a].link, node, b + t));}}// for (Node node:nodes){// System.out.println(node.link);// }}}private static boolean update(List<Integer> srcLink, Node dst) {// System.out.println(src.index+":"+src.link);// System.out.println(dst.index+":"+dst.link);if ((srcLink.size() > dst.link.size()) || ((srcLink.size() == dst.link.size())&& (srcLink.get(srcLink.size() - 1) < dst.link.get(dst.link.size() - 1)))) {dst.link = new ArrayList<>(srcLink);return true;}return false;}}/*** 更新消息*/class Message {List<Integer> srcLink;Node dst;int time;public Message(List<Integer> srcLink, Node dst, int time) {super();this.srcLink = new ArrayList<>(srcLink);this.dst = dst;this.time = time;}}class Node {int index;List<Integer> link;List<Node> partners;public Node(int n, int i) {index = i;link = new ArrayList<>(n);link.add(0);partners = new ArrayList<>(n);}}
