Problem Solving/Baekjoon

[백준] 15270 친구 팰린드롬 - Backtracking / Java

graycode 2023. 3. 2. 23:53

 문제 링크

 

15270번: 친구 팰린드롬

첫째 줄에 총 반친구 수 N(2<=N<=20, 재홍이 제외)와 관계도 수 M(0<=M<=(N^2-N)/2, 최대 50 제한)이 주어진다. 둘째 줄부터 M+1줄까지 친한 친구 관계는 출석번호 u, v로 나타나며 u와 v는 같지 않고, u와 v가

www.acmicpc.net

 

 풀이 과정

 

 풀이 코드

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

public class Main {

    static int n, m, max;
    static Pair[] pairs;
    static boolean[] visit;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        pairs = new Pair[m];
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            pairs[i] = new Pair(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }

        visit = new boolean[n + 1];

        recur(0, 0);

        max *= 2;
        if (max < n)
            max++;

        bw.write(String.valueOf(max));
        bw.flush();
    }

    private static void recur(int depth, int cnt) {
        if (depth == m) {
            max = Math.max(max, cnt);
            return;
        }

        int x = pairs[depth].x;
        int y = pairs[depth].y;

        if (visit[x] || visit[y])
            recur(depth + 1, cnt);
        else {
            visit[x] = visit[y] = true;
            recur(depth + 1, cnt + 1);

            visit[x] = visit[y] = false;
            recur(depth + 1, cnt);
        }
    }

    private static class Pair {
        int x, y;

        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

}