Strong Root

난이도 ★★★★☆


문제를 보시려면 여기를 클릭


이하는 코드입니다.


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
61
62
63
64
65
#include <stdio.h>
#include <string.h>
 
#pragma warning(disable:4996)
 
int n, m;
int edges[11][11];
 
int checkBoard[11];
int count;
 
void getPossibleCount() {
    /* pick p1 */
    int p1 = -1;
    for (int i = 0; i < n; i++) {
        if (checkBoard[i] == -1) {
            p1 = i;
            checkBoard[p1]++;
            break;
        }
    }
 
    // Finally, possible case was just found. count++
    if (p1 == -1) {
        count++;
        return;
    }
 
    /* pick p2 */
    for (int i = 0; i < n; i++) {
        if ((edges[p1][i] == 1) && (checkBoard[i] == -1)) {
            checkBoard[i]++;
            getPossibleCount();
            checkBoard[i]--;
        }
    }
 
    checkBoard[p1]--;
}
 
int main() {
    int C;
    scanf("%d", &C);
 
    for (int i = 0; i < C; i++) {
        scanf("%d %d", &n, &m);
 
        // get edges
        memset(edges, -1sizeof(edges));
        for (int j = 0; j < m; j++) {
            int p1, p2;
            scanf("%d %d", &p1, &p2);
 
            edges[p1][p2] = edges[p2][p1] = 1;
        }
 
        // 
        memset(checkBoard, -1sizeof(checkBoard));
        count = 0;
        getPossibleCount();
        printf("%d\n", count);
    }
 
    return 0;
}
cs