萌新就想用一下深度搜索解决问题,60分求助各位大佬
  • 板块P1657 选书
  • 楼主孙cy
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/7/22 20:35
  • 上次更新2023/11/6 22:33:47
查看原帖
萌新就想用一下深度搜索解决问题,60分求助各位大佬
195670
孙cy楼主2020/7/22 20:35

图的深度搜索,有回溯

#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;
}
2020/7/22 20:35
加载中...