[PICNIC] μν λ¬Έμ
λ¬Έμ
μλλ‘λ©λ€ μ μΉμ μ΅μ€νλ μ€λ°μμλ λ€μ μ£Όμ μ¨λ곡μμΌλ‘ μνμ κ°λλ€. μμ μ μλμ μν λ νμλ€μ λ λͺ μ© μ§μ μ§μ΄ νλνκ² νλ €κ³ ν©λλ€. κ·Έλ°λ° μλ‘ μΉκ΅¬κ° μλ νμλ€λΌλ¦¬ μ§μ μ§μ΄ μ£Όλ©΄ μλ‘ μΈμ°κ±°λ κ°μ΄ λμλ€λμ§ μκΈ° λλ¬Έμ, νμ μλ‘ μΉκ΅¬μΈ νμλ€λΌλ¦¬λ§ μ§μ μ§μ΄ μ€μΌ ν©λλ€.
κ° νμλ€μ μμ λν΄ μ΄λ€μ΄ μλ‘ μΉκ΅¬μΈμ§ μ¬λΆκ° μ£Όμ΄μ§ λ, νμλ€μ μ§μ§μ΄μ€ μ μλ λ°©λ²μ μλ₯Ό κ³μ°νλ νλ‘κ·Έλ¨μ μμ±νμΈμ. μ§μ΄ λλ νμλ€μ΄ μΌλΆλ§ λ€λ₯΄λλΌλ λ€λ₯Έ λ°©λ²μ΄λΌκ³ λ΄ λλ€. μλ₯Ό λ€μ΄ λ€μ λ κ°μ§ λ°©λ²μ μλ‘ λ€λ₯Έ λ°©λ²μ λλ€.
- (νμ°,μ μμΉ΄) (μ¨λ,ν°νλ) (ν¨μ°,μ 리)
- (νμ°,μ μμΉ΄) (μ¨λ,μ 리) (ν¨μ°,ν°νλ)
μ λ ₯
μ λ ₯μ 첫 μ€μλ ν μ€νΈ μΌμ΄μ€μ μ C (C <= 50) κ° μ£Όμ΄μ§λλ€. κ° ν μ€νΈ μΌμ΄μ€μ 첫 μ€μλ νμμ μ n (2 <= n <= 10) κ³Ό μΉκ΅¬ μμ μ m (0 <= m <= n*(n-1)/2) μ΄ μ£Όμ΄μ§λλ€. κ·Έ λ€μ μ€μ m κ°μ μ μ μμΌλ‘ μλ‘ μΉκ΅¬μΈ λ νμμ λ²νΈκ° μ£Όμ΄μ§λλ€. λ²νΈλ λͺ¨λ 0 λΆν° n-1 μ¬μ΄μ μ μμ΄κ³ , κ°μ μμ μ λ ₯μ λ λ² μ£Όμ΄μ§μ§ μμ΅λλ€. νμλ€μ μλ μ§μμ λλ€.
μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€λ§λ€ ν μ€μ λͺ¨λ νμμ μΉκ΅¬λΌλ¦¬λ§ μ§μ§μ΄μ€ μ μλ λ°©λ²μ μλ₯Ό μΆλ ₯ν©λλ€.
μμ μ λ ₯
3 2 1 0 1 4 6 0 1 1 2 2 3 3 0 0 2 1 3 6 10 0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5 |
μμ μΆλ ₯
1 3 4 |
λ¬Έμ νμ΄
μμ νμμ μ΄μ©ν΄ μ‘°ν©μ λͺ¨λ λ§λ€μ΄ 보μ.
μμ§ μ§μ μ°Ύμ§ λͺ»ν νμλ€μ λͺ λ¨μ΄ μ£Όμ΄μ§ λ μΉκ΅¬λΌλ¦¬ λμ© μ§μ§λ κ²½μ°μ μλ₯Ό κ³μ°ν΄λΌ.
-
μ§μ μ§μ νμλ€μ λͺ λ¨ - taken
-
μΉκ΅¬μΈ νμλ€μ λͺ λ¨ - areFriends
/* μΉκ΅¬μΈ νμλ€ λΌλ¦¬ μ§μ μ§μ΄μ£ΌκΈ° */
/* 2019-07-08 μν */
#include <iostream>
using namespace std;
bool areFriends[10][10]; //νμμ μκ° μ΅λ 10λͺ
μ΄κΈ° λλ¬Έμ
int findPair(int n, bool *taken) {
//taken - μ§μ ꡬνλκ° ?
//n - νμ μ
int first = -1;
for (int i = 0; i < n; i++) {
if (!taken[i]) {
first = i; // κ°μ₯ 첫λ²μ§Έλ‘ μ§μ ꡬνμ§ λͺ»ν μ¬λ
break;
}
}
if (first == -1) return 1; // λ€ μ§μ ꡬνλ€λ©΄ 1μ return νλ€.
int ret = 0;
for (int i = first + 1; i < n; i++) { // μ§μ μ ν μ¬λ μ°ΎκΈ°
if (!taken[i] && areFriends[first][i]) { //μ΄ μΉκ΅¬λ μ§μ΄ μκ³ μλ‘ μΉκ΅¬λΌλ©΄
taken[i] = taken[first] = true; // μ§μ ꡬν¨
ret += findPair(n, taken); // λ¨μ μ§ κ³ λ₯΄λ μμ
μ μ¬κ·λ‘ λ λκΈ΄ κ². λͺ¨λ μ§μ ꡬνλ€λ©΄ 1μ΄ μλλ©΄ 0μ΄ return λμμ κ²μ΄λ€.
taken[i] = taken[first] = false; // λ€λ₯Έ λ°©λ²λ μμ μ μμΌλ λ€μ μ΄κΈ°ν ν΄μ€λ€
}
}
return ret;
}
int main() {
int c; // ν
μ€νΈ μΌμ΄μ€μ μ
int n, m; // νμμ μ, μΉκ΅¬ μμ μ
cin >> c;
if (c > 50) return -1 ;
for (int i = 0; i < c; i++) {
int t1, t2;
bool taken[10] = { false, };
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
areFriends[i][j] = false;
}
}
cin >> n >> m;
//νμμ μλ 2~10
for (int j = 0; j < m; j++) { // μΉκ΅¬μ μ μ₯νκΈ°
cin >> t1 >> t2;
areFriends[t1][t2] = true;
areFriends[t2][t1] = true;
}
cout << findPair(n, taken) << endl;
}
return 0;
}
μκ³ λ¦¬μ¦ λ¬Έμ ν΄κ²° μ λ΅ 1μ μ½λλ₯Ό μ΄μ©ν΄μ νμλ€. μ²μμ νμμ μμμ 2κ°λ₯Ό λͺ¨λ μ‘°ν©μ μ°Ύλ μκ³ λ¦¬μ¦μ μ¬μ©νλ €κ³ νμΌλ λ¨μν μ§μ ꡬνλ κ²μ΄ μλλΌ νμλ€μ μ§ μ§μ μ μλ λ°©λ²μ μλ₯Ό ꡬν΄μΌ νκΈ° λλ¬Έμ μ±
μ μ°Έκ³ νλ€.
->μ¬κΈ°μ μ¬μ©ν μκ³ λ¦¬μ¦λ λΉμ·ν λ₯μμ κΉ¨λ¬μλ€.
μ± μμλ μ€λ³΅ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ κ°μ₯ λ²νΈκ° λΉ λ₯Έ νμμ μ§μ ꡬνλ λ°©λ²μ μ±ννκ³ , κ·Έλ κΈ° λλ¬Έμ findPair ν¨μμμλ κ°μ₯ 첫 λ²μ§Έλ‘ μ§μ ꡬνμ§ λͺ»ν μ¬λμ μ°ΎμλΈλ€. μ΄λ λͺ¨λ μ¬λμ΄ μ§μ ꡬνλ€λ©΄ νλμ λ°©λ²μ μ°Ύμ κ²μ΄κΈ° λλ¬Έμ 1μ return νλ€. μ΄ return λ 1μ μΆν retμ λν΄μ§λ€.
μ²μμ 0λΆν° μ§ κ΅¬νκΈ°λ₯Ό μμνλ€. 0μ μ§μ΄ λ μ¬λμ μ°Ύλλ° μκΈ° μμ κ³Όλ μΉκ΅¬κ° λ μ μκΈ° λλ¬Έμ 1λΆν° μ§μ΄ λ μ μλμ§ νλ³νλ€. μ§μ΄ λ μ μλ€λ©΄ μ§μ ꡬνλ€κ³ check ν ν, λ€μ λλ¨Έμ§ νμλ€μ μ§μ ꡬνκΈ° μν΄μ μ¬κ·λ‘ μκΈ° μμ μ νΈμΆνλ€.
λ§μ½ 0κ³Ό 1μ΄ μ§μ΄λΌκ³ νλ©΄ 2λ² μΉκ΅¬μ μ§μ μ°Ύκ² λ κ²μ΄λ€. 2λ² νμμ μ§μ΄ μλ€λ©΄ λͺ¨λ forλ¬Έμ λκ³ retμ λ°νν ν λ° μ΄λ retμ 0μ΄ λλ€. μ΄λ μ§μ§λ κ²μ΄ μ€ν¨νμμ λ»νλ€. νμ§λ§ 2λ² νμμ΄ 3λ² νμκ³Ό μΉκ΅¬λΌλ©΄ μ§μ μ§μ μ μλ€. μ΄ κ²½μ°μλ ifλ¬Έμ λ§μ‘±μμΌ λ€μ μ¬κ·λ‘ μκΈ° μμ μ νΈμΆνλ€. λ€μ νΈμΆλ findpair ν¨μκ° λ μ΄μ μ§μ ꡬν μ¬λμ΄ μλ κ²μ λ°κ²¬νκ³ 1μ return νλ€.
for (int i = first + 1; i < n; i++) { // μ§μ μ ν μ¬λ μ°ΎκΈ°
if (!taken[i] && areFriends[first][i]) { //μ΄ μΉκ΅¬λ μ§μ΄ μκ³ μλ‘ μΉκ΅¬λΌλ©΄
taken[i] = taken[first] = true; // μ§μ ꡬν¨
ret += findPair(n, taken); // λ¨μ μ§ κ³ λ₯΄λ μμ
μ μ¬κ·λ‘ λ λκΈ΄ κ². λͺ¨λ μ§μ ꡬνλ€λ©΄ 1μ΄ μλλ©΄ 0μ΄ return λμμ κ²μ΄λ€.
taken[i] = taken[first] = false; // λ€λ₯Έ λ°©λ²λ μμ μ μμΌλ λ€μ μ΄κΈ°ν ν΄μ€λ€
}
}
μ΄λκ° λΌμμΌ λλμ΄ firstκ° 0μ΄κ³ iκ° 1μΈ μν©μμ ret += findPair(n, taken); μ΄ λλ κ²μ΄λ€.
0κ³Ό 1μ΄ μ§μ΄ λλ κ²½μ°λΏ μλλΌ 0μ 2,3κ³Όλ μ§μ΄ λ μ μλ€(0μ΄ 1,2,3κ³Ό μΉκ΅¬λΌλ©΄). μ΄ κ²½μ°λ₯Ό λͺ¨λ νμΈνκΈ° μν΄μ λ λ€ μ§μ΄ μλ€κ³ μ΄κΈ°νν΄μ£Όκ³ λ€μ forλ¬Έμ λμκ°κ² λλ€. μ΄λ° μμΌλ‘ μμ subproblemμ ν΄κ²°νλ μ¬κ· ν¨μκ° λͺ¨λ λλκ² λκ³ μ²« λ²μ§Έλ‘ νΈμΆλ findPairν¨μκ° retλ₯Ό λ°ννλ©΄μ λͺ¨λ νμμ μΉκ΅¬λΌλ¦¬λ§ μ§μ§μ΄μ€ μ μλ λ°©λ²μ κ°μκ° μΆλ ₯λλ€.