1 ๋ถ„ ์†Œ์š”

๐Ÿ“ [S1_1992] ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™

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

public class Main {
	static int[][] map;
	static boolean[][] v;
	static int N,M;
	static int min;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine()," ");

		// input start
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		// ๊ด€๊ณ„๋„
		map = new int[N+1][N+1];
		// ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
		v = new boolean[N+1][N+1];

		// ๊ฒฐ๊ณผ๊ฐ’ ์ €์žฅ ๋ฐฐ์—ด
		int[] res = new int[N+1];

		for(int i=0; i<M; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());

			// ์–‘๋ฐฉํ–ฅ
			map[start][end] = 1;
			map[end][start] = 1;

		}

		// input end

		// ๋ฐฐ์—ด ๋Œ๋ฉด์„œ check
		for(int i=1;i<N+1;i++) {
			for(int j=1;j<N+1;j++) {
				// ์ถœ๋ฐœ๊ณผ ๋„์ฐฉ์ด ๊ฐ™์œผ๋ฉด ํ†ต๊ณผ
				if(i == j) continue;
				// ๋งŒ์•ฝ ํ•œ๋ฒˆ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ์œผ๋ฉด
				if(map[i][j] == 1) {
					// ์ผ€๋นˆ๋ฒ ์ด์ปจ ์ˆ˜ 1 ์ถ”๊ฐ€
					res[i] += 1;
				}
				// ํ•œ๋ฒˆ์— ์—ฐ๊ฒฐ์•ˆ๋˜์–ด์žˆ์œผ๋ฉด ๊ฒฝ๋กœ ์ฐพ๊ธฐ
				else {
					// ๋ฐฉ๋ฌธ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
					init();
					// ์ตœ์†Œ๊ฐ’ ์ดˆ๊ธฐํ™”
					min = Integer.MAX_VALUE;
					dfs(i,j,0);
					res[i] += min;
				}
			}
		}

		min = Integer.MAX_VALUE;
		// ๊ฒฐ๊ณผ๋ฒˆํ˜ธ
		int num = 0;
		// ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ ๊ตฌํ•˜๊ธฐ
		for(int i=res.length-1; i>0; i--) {
			min = Math.min(min,res[i]);
			if(min == res[i]) {
				num = i;
			}
		}

		System.out.println(num);
	}

	static void dfs(int start, int end, int sum) {
		// ๋„์ฐฉ
		if(map[start][end] == 1) {
			sum++;
			min = Math.min(sum, min);
			return;
		}

		for(int i=1;i<N+1;i++) {
			// ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€๊ฐ€ ๊ฐ™์œผ๋ฉด ํ†ต๊ณผ ( ๊ฐ€์ง€์น˜๊ธฐ )
			if(start == i) continue;
			// ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด
			if(map[start][i] == 1 && !v[start][i]) {
				// ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
				v[start][i] = true;
				v[i][start] = true;
				// ๊ฒฝ๋กœ ํ•˜๋‚˜ ๋”ํ•ด์ฃผ๊ธฐ
				sum++;
				dfs(i,end,sum);
				// ๋ฐฑํŠธ๋ž˜ํ‚น
				sum--;
				v[start][i] = false;
				v[i][start] = false;
			}
		}
	}

	// ๋ฐฉ๋ฌธ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
	static void init() {
		for(int i=1;i<N+1;i++) {
			for(int j=1;j<N+1;j++) {
				v[i][j] = false;
			}
		}
	}
}

๐Ÿค” ๋‚˜์˜ ์ƒ๊ฐ

๋ฌธ์ œ ์ดํ•ด๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค.
์„ค๋ช…์—์„œ ํ•œ๊ฐ€์ง€ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž์„ธํžˆ ์„ค๋ช…์„ ํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธใ…Žใ…Ž
์ฒ˜์Œ ์„ค๊ณ„ํ•  ๋•Œ ์ƒ๊ฐํ•œ ๊ฒƒ์ด

  • ๊ด€๊ณ„๋„ ์ €์žฅํ•  ๋ฐฐ์—ด int map[N+1][n+1]
  • N๋ช… ๋งˆ๋‹ค ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด int res[N+1]
  • ๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐฐ์—ด boolean v[N+1]
  • dfs(start,end,sum) ํ•จ์ˆ˜
  • ๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ init()

์ด๋ ‡๊ฒŒ ๊ตฌ์ƒ์„ ํ–ˆ๋Š”๋ฐ ์ƒ๊ฐํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋งž์•„๋–จ์–ด์ ธ์„œ ๊ธฐ๋ถ„์ด ์ข‹์•˜๋‹ค ใ…Žใ…Ž
N๋ช…์˜ ์œ ์ €๋“ค๋งˆ๋‹ค ๋‹ค๋ฅธ ์œ ์ €๋“ค์˜ ๊ฒฝ๋กœ๋“ค์„ ๋‹ค ๋”ํ•ด์„œ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๋ฅผ ๊ตฌํ•ด์ฃผ๊ณ 
N๊ฐœ์˜ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์˜ ์œ ์ €๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
๋งŒ์•ฝ ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ˆ˜๊ฐ€ ๋” ์ ์€ ์œ ์ €๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์ด์ค‘ for ๋ฌธ๊ณผ dfs ๋ฅผ ํ†ตํ•ด ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.

ํƒœ๊ทธ: , , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: