250523 교수님은 기다리지 않는다

Jongleee·2025년 5월 23일
0

TIL

목록 보기
907/970
static class Node {
	int parent;
	long weightDiff;

	Node(int parent) {
		this.parent = parent;
	}
}

public static void main(String[] args) throws IOException {
	final String unknown = "UNKNOWN\n";
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	StringBuilder sb = new StringBuilder();

	while (true) {
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		if (n == 0)
			break;
		int m = Integer.parseInt(st.nextToken());

		Node[] nodes = new Node[n + 1];
		for (int i = 1; i <= n; i++)
			nodes[i] = new Node(i);

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			String command = st.nextToken();
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());

			if (command.equals("!")) {
				int w = Integer.parseInt(st.nextToken());
				union(nodes, a, b, w);
			} else {
				if (find(nodes, a) == find(nodes, b)) {
					long diff = nodes[b].weightDiff - nodes[a].weightDiff;
					sb.append(diff).append("\n");
				} else {
					sb.append(unknown);
				}
			}
		}
	}

	System.out.println(sb);
}

private static int find(Node[] nodes, int x) {
	if (x == nodes[x].parent)
		return x;
	int root = find(nodes, nodes[x].parent);
	nodes[x].weightDiff += nodes[nodes[x].parent].weightDiff;
	return nodes[x].parent = root;
}

private static void union(Node[] nodes, int a, int b, int w) {
	int rootA = find(nodes, a);
	int rootB = find(nodes, b);
	if (rootA != rootB) {
		nodes[rootB].parent = rootA;
		nodes[rootB].weightDiff = nodes[a].weightDiff - nodes[b].weightDiff + w;
	}
}

출처:https://www.acmicpc.net/problem/3830

0개의 댓글