跳转至

ALGOSPOT-PICNIC(递归)

原文为韩文,这里翻译成中文,提交在algospot。

问题

仙女座幼稚园特快班将在Yuldong公园旁野餐。老师想让两个学生在野餐时成对表演。但是,如果结交了不是朋友的学生,则您不会互相争斗或四处走动,因此,您应该始终仅将彼此为朋友的学生配对。

对于每对学生,编写一个程序,计算给学生配对的方式,并确定他们是否是彼此的朋友。即使只有几个配对的学生是不同的,它也是不同的。例如,以下两种方法是不同的。

  • (泰妍,杰西卡)(晴天,蒂芙尼)(孝延,尤里)
  • (泰妍,杰西卡)(晴天,格拉斯)(孝妍,蒂芙尼)

输入项

输入的第一行给出了测试用例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

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n = 10, m = 45;
vector<vector<int>> ground(n, vector<int>(n, 0)); 
vector<bool> visit(n, false);

int solve()
{
    int firstFree = -1;
    for (int i = 0; i < n; ++i) {
        if (!visit[i]) {
            firstFree = i;
            break;
        }
    }
    if (firstFree == -1) return 1;
    int cnt = 0;
    for (int i = firstFree + 1; i < n; ++i) {
        if (!visit[i] && ground[firstFree][i]) {
            visit[firstFree] = visit[i] = true;
            cnt += solve();
            visit[firstFree] = visit[i] = false;
        }
    }

    return cnt;
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int caseNum;
    cin >> caseNum;
    while (caseNum--) {
        cin >> n >> m;
        for (int i = 0; i < m; ++i) {
            int point1, point2;
            cin >> point1 >> point2;
            ground[point1][point2] = 1;
            ground[point2][point1] = 1;
        }
        cout << solve() << endl;
        fill(visit.begin(), visit.end(), false);
        for (int i = 0; i < n; ++i)
            fill(ground[i].begin(), ground[i].end(), 0);
    }

    return 0;
}