ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • picnic, 하
    종만북 2021. 9. 4. 14:40
     

    algospot.com :: PICNIC

    소풍 문제 정보 문제 안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로

    algospot.com

    문제

    • 학생 수 $n(2\leq n \leq 10,\ 2\mid n)$와 $m(0\leq m \leq \binom{n}{2})$쌍의 친구관계가 주어진다
    • 친구관계인 사람들끼리만 두명씩 짝지을 수 있는 경우의 수는?

     

    $O(\frac{\binom{n}{2}\binom{n-2}{2}\cdot \cdot \cdot\binom{2}{2}}{\frac{n}{2}!})$

    $n=10$일 때, 완전탐색을 진행하여도 $9 \cdot 7 \cdot 5 \cdot 3 = 945$번만 확인하면 된다

    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
    #include <bits/stdc++.h>
    #define endl "\n"
    #define ooop(i, n) for(int i = 0; i < n; i++)
    #define loop(i, n) for(int i = 1; i <= n; i++)
    using namespace std;
     
    int n, m;
     
    int countPairings(vector<bool>& taken, const vector<vector<bool> >& isfriend)
    {
        int firstFree = -1;
        ooop(i, n){
            if(!taken[i]) {
                firstFree = i;
                break;
            }
        }
     
        if(firstFree == -1return 1;
     
        int ret = 0;
        for(int i = firstFree + 1; i < n; i++){
            if(!taken[i] && isfriend[firstFree][i]){
                taken[firstFree] = taken[i] = true;
                ret += countPairings(taken, isfriend);
                taken[firstFree] = taken[i] = false;
            }
        }
     
        return ret;
    }
     
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
     
        int t;
        cin >> t;
        while(t--){
            cin >> n >> m;
            vector<vector<bool> > isfriend(n, vector<bool>(n));
     
            int a, b;
            while(m--){
                cin >> a; cin >> b;
                isfriend[a][b] = true;
                isfriend[b][a] = true;
            }
     
            vector<bool> taken(n);
     
            cout << countPairings(taken, isfriend) << endl;
     
        }
     
        return 0;

    '종만북' 카테고리의 다른 글

    boardcover, 하  (0) 2021.09.04

    댓글

Designed by Tistory.