使用二进制进行DFS 海贼王之伟大航路

来源:互联网 发布:剑桥少儿英语教学软件 编辑:程序博客网 时间:2024/04/28 19:16
//用二进制存储深搜路径,递归求解出最优值,值得借鉴啊!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int maxn = 16;

int m[maxn][maxn];//从0开始存储节点,故最大为N-1
int path[maxn][(1<<maxn)];
int N;
int besttime;

void dfs(int curpoint,int curtime,int curpath) {
    //printf("curtime = %d\n",curtime);

    if(curtime > besttime) {//已无进行的意义,减枝!
        return;
    }
    if(curpoint == N-1 && curpath < ((1<<N)-1)) {//未遍历所有节点,减枝!
        return;
    }

    if(path[curpoint][curpath] <= curtime) {
        return;
    } else {
        path[curpoint][curpath] = curtime;
    }

    if(curpoint == N-1 && curpath == ((1<<N)-1)) {//迭代求最优解
        besttime = min(besttime,curtime);
        return;
    }

    for(int i = 0;i < N;i++) {
        if(i != curpoint && m[curpoint][i] > 0 && ((curpath&(1<<i)) == 0)) {//递归查找下个节点
            dfs(i,curtime+m[curpoint][i],(curpath+(1<<i)));
        }
    }
}

int main() {

    besttime = (1<<30);//取最大值!

    scanf("%d",&N);

    for(int i = 0;i < N;i++) {
        for(int j = 0;j < N;j++) {
            scanf("%d",&m[i][j]);
        }
    }

    memset(path,0x7f,sizeof(path));//设默认最大值

    dfs(0,0,1);

    printf("%d\n",besttime);

    return 0;
}
/*
4
0 10 20 999
5 0 90 30
99 50 0 10
999 1 2 0

5
0 18 13 98 8
89 0 45 78 43
22 38 0 96 12
68 19 29 0 52
95 83 21 24 0
*/

0 0
原创粉丝点击