dfs로 그룹을 나누고 그룹에서 2명씩 짝지을 수 있는 최대 수를 구한 뒤 로봇춤 출 사람 있나 확인하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
 
const int MV = 20;
 
int n, m, cnt, res, g[MV + 1], ind[MV + 1], cn;
vector<int> a[MV + 1], gr[MV + 1];
 
int gro(int x) {
    if (g[x]) return 0;
    ind[x] = cn++;
    g[x] = cnt;
    gr[cnt].push_back(x);
    for (int i : a[x]) {
        if (!g[i]) gro(i);
    }
    return 0;
}
 
int dp(int key, int gn, vector<int> &v) {
    if (v[key] != -1return v[key];
    int ans = 0;
    for (int i : gr[gn]) {
        if (key&(1 << ind[i])) continue;
        for (int j : a[i]) {
            if (key&(1 << ind[j])) continue;
            ans = max(ans, dp(key | (1 << ind[i]) | (1 << ind[j]), gn, v) + 2);
        }
    }
    v[key] = ans;
    return ans;
}
 
void gen(int gn) {
    vector<int> d;
    d.resize((1 << gr[gn].size()) + 1-1);
    res += dp(0, gn, d);
}
 
int main() {
    scanf("%d%d"&n, &m);
    while (m--) {
        int u, v;
        scanf("%d%d"&u, &v);
        u--; v--;
        a[u].push_back(v); a[v].push_back(u);
    }
    for (int i = 0; i < n; i++) {
        if (g[i]) continue;
        cn = 0; cnt++;
        gro(i);
    }
    for (int i = 1; i <= cnt; i++) gen(i);
    if (res != n) res++;
    printf("%d", res);
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

14941 호기심  (0) 2018.02.17
14942 개미  (0) 2018.02.17
15271 친구 팰린드롬 2  (0) 2018.02.17
15312 이름 궁합  (0) 2018.02.17
1371 가장 많은 글자  (0) 2018.02.17

+ Recent posts