03
03

https://www.acmicpc.net/problem/1717

 

1717๋ฒˆ: ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

์ดˆ๊ธฐ์— $n+1$๊ฐœ์˜ ์ง‘ํ•ฉ $\{0\}, \{1\}, \{2\}, \dots , \{n\}$์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ๊ณผ, ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘

www.acmicpc.net

ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ 

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค. ์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ์ธ๋ฐ ๋ณต์Šต์‚ผ์•„ ํ•œ๋ฒˆ ๋” ํ’€์–ด๋ดค๋‹ค.

์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ๋Š” make, find, union ์„ธ ๋‹จ๊ณ„๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉด๋˜๋Š”๋ฐ, ๊ฐ๊ฐ ์‚ดํŽด๋ณด์ž.

	public static void make() {
		p = new int[n + 1];
		for (int i = 0; i <= n; i++) {
			p[i] = i;
		}
	}

	public static int find(int a) {
		if (p[a] == a)
			return a;

		return p[a] = find(p[a]);
	}

	public static boolean union(int a, int b) {
		int pa = find(a);
		int pb = find(b);

		if (pa == pb)
			return false;
		p[pb] = pa;
		return true;
	}

make๋Š” ๊ทธ๋ƒฅ i๋ฒˆ์งธ ๋ถ€๋ชจ๊ฐ€ i๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ค€๋น„๋‹จ๊ณ„๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. 

find๊ฐ€ ํ•ต์‹ฌ๋กœ์ง์ด๊ธฐ ๋•Œ๋ฌธ์— union๋จผ์ € ๋ณด์ž.

	public static boolean union(int a, int b) {
		int pa = find(a);
		int pb = find(b);

		if (pa == pb)
			return false;
		p[pb] = pa;
		return true;
	}

๋น„๊ต ๋Œ€์ƒ ๋‘ ๊ฐœ๋ฅผ ๊ฐ–๊ณ , ๊ฐ๊ฐ์˜ root๋ฅผ ๊ฐ–๊ณ ์˜จ๋‹ค. ์ •ํ™•ํžˆ๋Š” ์–ด๋Š ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ๋Š” ์ง€๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ๊ฒŒ pa = find(a)๊ณผ์ •์ด๋‹ค. 

๋งŒ์•ฝ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ์œผ๋ฉด unionํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ๋‹ค๋ฉด ์ด์ œ ์ง‘ํ•ฉ์— ํฌํ•จ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค. ์ด๊ฑด ๊ตฌํ˜„๋ฐฉ์‹์˜ ์ฐจ์ด์ธ๋ฐ, ๋‚˜๋Š” ์ฒซ๋ฒˆ ์งธ ์ธ์ž๋ฅผ ๋ถ€๋ชจ, ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ž์‹ํ›„๋ณด ๋กœ ์ƒ๊ฐํ•˜๊ณ  union์„ ์ง ๋‹ค.

b๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง‘ํ•ฉ์ด a๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง‘ํ•ฉ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋ฉด ์ด์ œ a์™€ b๋Š” ๊ฐ™์€ ์ง‘ํ•ฉ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ  union์ด ๋ฐœ์ƒํ–ˆ์œผ๋ฏ€๋กœ true๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

true, false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ๋Š” ๊ฐ™์€ ์ง‘ํ•ฉ์ธ์ง€, ์•„๋‹Œ์ง€๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

์ด์ œ find๋ฅผ ๋ณด์ž.

	public static int find(int a) {
		if (p[a] == a)
			return a;

		return p[a] = find(p[a]);
	}

a์˜ ์ง‘ํ•ฉ(p[a])์ด a ์ž์‹ ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ a๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๊ณ , ๋งŒ์•ฝ ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด a๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง‘ํ•ฉ์ด p[a]๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง‘ํ•ฉ์„ ์žฌ๊ท€์ ์œผ๋กœ ๋„ฃ์–ด์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ depth๊ฐ€ 1์ธ ์ง‘ํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

https://www.acmicpc.net/problem/1976

 

1976๋ฒˆ: ์—ฌํ–‰ ๊ฐ€์ž

๋™ํ˜์ด๋Š” ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ํ•œ๊ตญ์—๋Š” ๋„์‹œ๊ฐ€ N๊ฐœ ์žˆ๊ณ  ์ž„์˜์˜ ๋‘ ๋„์‹œ ์‚ฌ์ด์— ๊ธธ์ด ์žˆ์„ ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋™ํ˜์ด์˜ ์—ฌํ–‰ ์ผ์ •์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ์—ฌํ–‰ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ธ

www.acmicpc.net

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ดค๋Š”๋ฐ, ์ด ๋ฌธ์ œ์—์„œ ์ค‘์š”ํ•œ ์ ์€ ๋„์‹œ ๋ฒˆํ˜ธ๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์•„๋ฌด์ƒ๊ฐ์—†์ด zero-base๋กœ ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ‹€๋ฆฌ๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๋‹ค..!

import java.util.*;
import java.io.*;

public class Main {
	static int[] p;
	static int n;

	static void make() {
		p = new int[n + 1];
		for (int i = 0; i < n; i++) {
			p[i] = i;
		}
	}

	static int find(int a) {
		if (p[a] == a)
			return a;
		return p[a] = find(p[a]);
	}

	static void union(int a, int b) {
		int pa = find(a);
		int pb = find(b);
		if (pa != pb) {
			p[pb] = pa;
		}
	}

	public static void main(String[] args) throws Exception {
		// System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		make();
		int target = Integer.parseInt(br.readLine());
		for (int i = 1; i <= n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			for (int j = 1; j <= n; j++) {
				int tmp = Integer.parseInt(st.nextToken());
				if (tmp == 1) {
					union(i, j);
				}
			}
		}
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int start = find(Integer.parseInt(st.nextToken()));
		boolean flag = true;
		if (st.hasMoreTokens()) {
			for (int i = 0; i < target - 1; i++) {
				int tmp = Integer.parseInt(st.nextToken());
				if (start != find(tmp)) {
					flag = false;
					break;
				}
			}
		}

		if (flag) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}
	}
}

 


์ •๋‹ต์ฝ”๋“œ

import java.util.*;
import java.io.*;

public class Main {
	static int[] p;
	static int n;

	public static void make() {
		p = new int[n + 1];
		for (int i = 0; i <= n; i++) {
			p[i] = i;
		}
	}

	public static int find(int a) {
		if (p[a] == a)
			return a;

		return p[a] = find(p[a]);
	}

	public static boolean union(int a, int b) {
		int pa = find(a);
		int pb = find(b);

		if (pa == pb)
			return false;
		p[pb] = pa;
		return true;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		make();
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int target = Integer.parseInt(st.nextToken());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			if (target == 0) {
				// union
				union(a, b);
			} else {
				if (find(a) == find(b)) {
					sb.append("YES").append("\n");
				} else {
					sb.append("NO").append("\n");
				}
			}
		}
		System.out.println(sb);
	}

}

 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT