使用二进制进行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
*/
#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
- 使用二进制进行DFS 海贼王之伟大航路
- 海贼王之伟大航路(DFS)
- [OpenJ_Bailian - 4124 海贼王之伟大航路] DFS+二进制状态压缩 / 状压DP
- OpenJudge 海贼王之伟大航路 DFS+状态压缩
- 【OpenJudge 4124】海贼王之伟大航路(DP DFS)
- 海贼王之伟大航路解题报告
- openjudge 海贼王之伟大航路
- Openjudge:4979:海贼王之伟大航路
- poj 4124:海贼王之伟大航路
- DFS 简单的剪枝和状态压缩 海贼王之伟大航路
- OpenJudge_P4979 海贼王之伟大航路(状态压缩DP)
- dp tsp问题 海贼王之伟大航路
- 百练 4124 海贼王之伟大航路
- OpenJudge 4124 海贼王之伟大航路 深搜剪枝
- ACM 海贼王之伟大航路(深搜剪枝)
- ACM 海贼王之伟大航路(深搜剪枝)
- ACM 海贼王之伟大航路(深搜剪枝)
- ACM 海贼王之伟大航路(深搜剪枝)
- CALL指令有多少种写法
- Git常用命令总结
- 909422229__JAVA最全总结【必备】
- Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
- HDU 1517 A Multiplication Game(博弈找规律)
- 使用二进制进行DFS 海贼王之伟大航路
- 人工智能十月怀胎记:1955-1956,从孕育到诞生
- JNI log来代替printf打印调试
- 指南第一章 例题二 UVA 11729 Commando War(贪心算法)
- POJ 1947 Rebuilding Roads ( 树形DP )
- BZOJ3441 乌鸦喝水
- Linux下安装Jetty服务器部署Jenkins
- 【第一行代码-Android】学习(一)及在studio的迁移(4)intent学习
- bootstrap中tab的跳转问题