图的深度搜索,有回溯
#include <iostream>
#include <vector>
using namespace std;
int map[21][21] = { 0 };
bool judge[21][21] = { 0 };
int n;
int total = 0;
int dfs(int x, int y)//返回从点(x,y)开始的路径方案总数
{
if (judge[x][y] == 1|| map[x][y] == 0)
return 0;
if (x == n&&map[x][y]==1)
return 1;
vector<int>num1;
vector<int>num2;
vector<int>::iterator it;
for (int i = 1; i <= n; i++)
{
if (judge[i][y] == 1)
num1.push_back(i);
}
for (int i = 1; i <= n; i++)
{
if (judge[x][i] == 1)
num2.push_back(i);
}
for (int i = 1; i <= n; i++)
{
judge[i][y] = 1;
judge[x][i] = 1;
}
int ans = 0;
for (int i = 1; i <= n; i++)
ans += dfs(x + 1, i);
for (int i = 1; i <= n; i++)//回溯
{
judge[i][y] = 0;
judge[x][i] = 0;
}
for(it=num1.begin();it!=num1.end();it++)
judge[*it][y] = 1;
for (it = num2.begin(); it != num2.end(); it++)
judge[x][*it] = 1;
return ans;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
map[a][i] = 1;
map[b][i] = 1;
}
for (int i = 1; i <= n; i++)
total += dfs(i, 1);
cout << total << endl;
return 0;
}