-
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$번만 확인하면 된다
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#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 == -1) return 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;}cs'종만북' 카테고리의 다른 글
boardcover, 하 (0) 2021.09.04