๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 5567๋ฒˆ: ๊ฒฐํ˜ผ์‹(๊ทธ๋ž˜ํ”„, ๊ตฌํ˜„)

by ์ฃผ๋ฐœ2 2020. 3. 26.
๋ฐ˜์‘ํ˜•

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

 

5567๋ฒˆ: ๊ฒฐํ˜ผ์‹

๋ฌธ์ œ ์ƒ๊ทผ์ด๋Š” ์ž์‹ ์˜ ๊ฒฐํ˜ผ์‹์— ํ•™๊ต ๋™๊ธฐ ์ค‘ ์ž์‹ ์˜ ์นœ๊ตฌ์™€ ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋ฅผ ์ดˆ๋Œ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ƒ๊ทผ์ด์˜ ๋™๊ธฐ๋Š” ๋ชจ๋‘ N๋ช…์ด๊ณ , ์ด ํ•™์ƒ๋“ค์˜ ํ•™๋ฒˆ์€ ๋ชจ๋‘ 1๋ถ€ํ„ฐ N๊นŒ์ง€์ด๋‹ค. ์ƒ๊ทผ์ด์˜ ํ•™๋ฒˆ์€ 1์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ๋™๊ธฐ๋“ค์˜ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ์กฐ์‚ฌํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒฐํ˜ผ์‹์— ์ดˆ๋Œ€ํ•  ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ž…๋ ฅ ์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด์˜ ๋™๊ธฐ์˜ ์ˆ˜ n (2 ≤ n ≤ 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด m (1 ≤ m

www.acmicpc.net

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static int arr[][];		// ์นœ๊ตฌ ๊ด€๊ณ„
	public static boolean visit[];	// ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
	public static int n;	// ๋™๊ธฐ ์ˆ˜
	public static int m;	// ๋ฆฌ์ŠคํŠธ ๊ธธ์ด
	public static int count = 0;	// ์ดˆ๋Œ€ํ•  ์นœ๊ตฌ ์ˆ˜

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(bf.readLine());
		m = Integer.parseInt(bf.readLine());
		arr = new int[n+1][n+1];
		visit = new boolean[n+1];

		for(int i=0; i<m; i++) {
			StringTokenizer st = new StringTokenizer(bf.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			arr[a][b] = arr[b][a] = 1;	// ์นœ๊ตฌ ๊ด€๊ณ„ ํ‘œ์‹œ
		}

		for(int i=2; i<=n; i++) {
			if(arr[1][i] == 1) {	 // ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ์ธ ๊ฒฝ์šฐ
				if(!visit[i]) {		 // ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ์ธ๋ฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
					count ++;		 // ์ดˆ๋Œ€
					visit[i] = true; // ๋ฐฉ๋ฌธ ํ‘œ์‹œ
				}

				// ์ƒ๊ทผ์ด ์นœ๊ตฌ์˜ ์นœ๊ตฌ ์ฐพ๊ธฐ - ์ƒ๊ทผ์ด์™€ ์—ฐ๊ฒฐ๋œ ์ •์ ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ •์  ์ฐพ๊ธฐ.
				for(int j=2; j<=n; j++) {
					if(arr[i][j] == 1 && !visit[j]) {
						count ++;			// ์ƒ๊ทผ์ด ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋„ ์ดˆ๋Œ€
						visit[j] = true;	// ๋ฐฉ๋ฌธ ํ‘œ์‹œ
					}
				}
			}
		}

		System.out.println(count);
		bf.close();
	}

}

ํ’€์ด

๊ทธ๋ž˜ํ”„ - ์ •์ , ๊ฐ„์„ ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋‹ค.

๋ฌธ์ œ์˜ ์˜ˆ์ œ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

์œ„ ๊ทธ๋ฆผ์—์„œ 1๋ฒˆ์ด ์ƒ๊ทผ์ด๊ณ , ์ƒ๊ทผ์ด๋Š” ์นœ๊ตฌ์™€ ์นœ๊ตฌ์˜ ์นœ๊ตฌ ๊นŒ์ง€๋งŒ ์ดˆ๋Œ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(1->2 , 2->1)์ด๋ฉฐ, ์นœ๊ตฌ(๊ฐ„์„ ) ์™€ ์นœ๊ตฌ์˜ ์นœ๊ตฌ(๊ฐ„์„ ์˜ ๊ฐ„์„ )์ธ์ง€ ๋น„๊ตํ•˜๋ฉฐ ์ดˆ๋Œ€ํ•œ๋‹ค.

์ƒ๊ทผ์ด์™€ 2๋ฒˆ, 3๋ฒˆ์€ ์นœ๊ตฌ๊ณ  4๋ฒˆ์€ 3๋ฒˆ์˜ ์นœ๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์นœ๊ตฌ(3)์˜ ์นœ๊ตฌ(4)์—ฌ์„œ ์ดˆ๋Œ€๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,

5๋ฒˆ๊ณผ 6๋ฒˆ์€ ๊ด€๊ณ„๊ฐ€ ์—†์–ด์„œ ์ดˆ๋Œ€๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ์ดˆ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒˆํ˜ธ๋Š” 2, 3, 4 3๋ช…์ด๋‹ค.

 

๋จผ์ € ์ธ์ ‘ํ–‰๋ ฌ์„ ๊ตฌํ˜„ํ•œ๋‹ค.(dfs์ผ์ค„ ์•Œ๊ณ  static์œผ๋กœ ๋ณ€์ˆ˜๋“ค์„ ์„ ์–ธํ–ˆ๋‹ค ...)

๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ n+1๋กœ ์žก๋Š”๋‹ค.

		arr = new int[n+1][n+1];
		visit = new boolean[n+1];

		for(int i=0; i<m; i++) {
			StringTokenizer st = new StringTokenizer(bf.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			arr[a][b] = arr[b][a] = 1;	// ์นœ๊ตฌ ๊ด€๊ณ„ ํ‘œ์‹œ
		}

 

 

๊ทธ ํ›„ 2๋ฒˆ๋ถ€ํ„ฐ ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ์ธ์ง€ ํŒ๋‹จํ•œ๋‹ค.

๋ฐ˜์•ฝ ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ์ธ ๊ฒฝ์šฐ(arr[1][i] == 1)

 - ๊ทธ ์นœ๊ตฌ๋Š” ์ดˆ๋Œ€ํ•˜๊ณ  ์ดˆ๋Œ€ํ•œ ์นœ๊ตฌ์ด๋ฏ€๋กœ ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

 - ๊ทธ ํ›„ ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ด ์นœ๊ตฌ์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์นœ๊ตฌ๋ฅผ ์ฐพ๋Š”๋‹ค. (arr[i][j] == 1 && ! visit[j])

		for(int i=2; i<=n; i++) {
			if(arr[1][i] == 1) {	 // ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ์ธ ๊ฒฝ์šฐ
				if(!visit[i]) {		 // ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ์ธ๋ฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
					count ++;		 // ์ดˆ๋Œ€
					visit[i] = true; // ๋ฐฉ๋ฌธ ํ‘œ์‹œ
				}

				// ์ƒ๊ทผ์ด ์นœ๊ตฌ์˜ ์นœ๊ตฌ ์ฐพ๊ธฐ - ์ƒ๊ทผ์ด์™€ ์—ฐ๊ฒฐ๋œ ์ •์ ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ •์  ์ฐพ๊ธฐ.
				for(int j=2; j<=n; j++) {
					if(arr[i][j] == 1 && !visit[j]) {
						count ++;			// ์ƒ๊ทผ์ด ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋„ ์ดˆ๋Œ€
						visit[j] = true;	// ๋ฐฉ๋ฌธ ํ‘œ์‹œ
					}
				}
			}
		}

์ƒ๊ทผ์ด์˜ ์นœ๊ตฌ์™€ ์นœ๊ตฌ(arr[i][j] == 1) ์ด๊ณ , ์ดˆ๋Œ€ํ•˜์ง€ ์•Š์€ ์นœ๊ตฌ(๋ฐฉ๋ฌธํ‘œ์‹œ๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ์นœ๊ตฌ)์ธ ๊ฒฝ์šฐ,

๊ทธ ์นœ๊ตฌ๊นŒ์ง€ ์ดˆ๋Œ€๋ฅผ ํ•˜๊ณ  ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€