ACM: 强化训练-海贼王之伟大航路-dfs-枝减
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
“我是要成为海贼王的男人!”,路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历程。
路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着“唯一的大秘宝”——ONE PIECE)。而航程中间,则是各式各样的岛屿。
因为伟大航路上的气候十分异常,所以来往任意两个岛屿之间的时间差别很大,从A岛到B岛可能需要1天,而从B岛到A岛则可能需要1年。当然,任意两个岛之间的航行时间虽然差别很大,但都是已知的。
现在假设路飞一行从罗格镇(起点)出发,遍历伟大航路中间所有的岛屿(但是已经经过的岛屿不能再次经过),最后到达拉夫德鲁(终点)。假设他们在岛上不作任何的停留,请问,他们最少需要花费多少时间才能到达终点?
Input
第一行包含一个整数N(2 < N ≤ 16),代表伟大航路上一共有N个岛屿(包含起点的罗格镇和终点的拉夫德鲁)。其中,起点的编号为1,终点的编号为N。
之后的N行每一行包含N个整数,其中,第i(1 ≤ i ≤ N)行的第j(1 ≤ j ≤ N)个整数代表从第i个岛屿出发到第j个岛屿需要的时间t(0 < t < 10000)。第i行第i个整数为0。
Output
Sample Input
样例输入1:
4
0 10 20 999
5 0 90 30
99 50 0 10
999 1 2 0 样例输入2:
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
Sample Output
样例输出1:
100 样例输出2:
137
Hint
对于样例输入1:路飞选择从起点岛屿1出发,依次经过岛屿3,岛屿2,最后到达终点岛屿4。花费时间为20+50+30=100。
对于样例输入2:可能的路径及总时间为:
1,2,3,4,5: 18+45+96+52=211
1,2,4,3,5: 18+78+29+12=137
1,3,2,4,5: 13+38+78+52=181
1,3,4,2,5: 13+96+19+43=171
1,4,2,3,5: 98+19+45+12=174
1,4,3,2,5: 98+29+38+43=208
所以最短的时间花费为137
单纯的枚举在N=16时需要14!次运算,一定会超时。
/*/
中文题。。。。
题目告诉我们直接历遍会超时,所以需要去剪枝,关键是怎么剪枝。
这里有几个思路:
1.减去途中已经比之前的mint更大的枝;
2.从1经过2 3 4 到达 5有很多种方法,记录到达这个时候的最小时间,减去比到达这个状态耗时更多的状态。 /*/ #include"iostream"
#include"cstdio"
#include"cstring"
#include"algorithm"
using namespace std; //神奇的二进制强行搜索。。。
int vis[17][1<<18];
//一开始 vis 我设置的是一维的发现虽然已经走过的岛虽然已经成功记录,但是现在所在的岛可能不同,所以还得加一维。
int node[17][17];
bool ifgone[17];
//记录岛是否走过
int mint;
int x,T;
void dfs(int nowland,int nowtime,int nowstate) {
x++; //这里是走过的岛的个数
ifgone[nowland]=1;
if(x==T-1) {//如果走到了倒数第二个岛,直接加上该岛到最后一个岛的时间比较最小时间,深搜结束
mint=min(mint,nowtime+node[nowland][T]);
return;
}
if(nowtime>=mint) {//如果已经超过最小的时间了,深搜结束;
return;
}
if(nowtime<vis[nowland][nowstate]||vis[nowland][nowstate]==0) {
vis[nowland][nowstate]=nowtime;
} else return; //如果现在这个状态和之前来过的相同状态比所用时间要更加大的话,深搜结束; for(int i=1; i<T; i++) {
if(ifgone[i]==0) { //继续往没走过的岛去搜索
dfs(i,nowtime+node[nowland][i],nowstate+((1<<nowland-1))); //【1<<nowland 和 noland<<1 这两个一个是2^nowland 一个是nowland*2 找了好久。。。】
x--;
ifgone[i]=0;//这里要记得清空走过的标记
}
} } int main() {
while(~scanf("%d",&T)) {
for(int i=1; i<=T; i++) {
for(int j=1; j<=T; j++) {
scanf("%d",&node[i][j]);
}
}
x=0;
memset(vis,0,sizeof(vis));
memset(ifgone,0,sizeof(ifgone));
mint=1<<29;
dfs(1,0,1);
printf("%d\n",mint);
}
return 0;
}
ACM: 强化训练-海贼王之伟大航路-dfs-枝减的更多相关文章
- ACM: 强化训练-Beautiful People-最长递增子序列变形-DP
		199. Beautiful People time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard ... 
- ACM: 强化训练-Roads in the North-BFS-树的直径裸题
		Roads in the North Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu De ... 
- ACM: 强化训练-Inversion Sequence-线段树 or STL·vector
		Inversion Sequence Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%lld & %llu D ... 
- ACM: 强化训练-百度之星-Problem C-字典树
		Problem C Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64u Descript ... 
- ACM 海贼王之伟大航路(深搜剪枝)
		"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ... 
- ACM暑期训练总结
		ACM暑期集训总结报告 不知不觉,ACM暑期集训已经过去了一个月了(其实我还差几天才够一个月,因为最后几天要回家办助学贷款,所以没坚持到最后,当了个逃兵.....[汗])也到了结束的时候.在这一个月中 ... 
- ACM:  限时训练题解-Heavy Coins-枚举子集-暴力枚举
		Heavy Coins Bahosain has a lot of coins in his pocket. These coins are really heavy, so he always ... 
- HDU ACM 1078 FatMouse and Cheese 记忆化+DFS
		题意:FatMouse在一个N*N方格上找吃的,每一个点(x,y)有一些吃的,FatMouse从(0,0)的出发去找吃的.每次最多走k步,他走过的位置能够吃掉吃的.保证吃的数量在0-100.规定他仅仅 ... 
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
		Generalized Palindromic Number Time Limit: 2 Seconds Memory Limit: 65536 KB A number that will ... 
随机推荐
- 重温WCF之数据契约中使用枚举(转载)(十一)
			转载地址:http://www.zhuli8.com/wcf/EnumMember.html 枚举类型的定义总是支持序列化的.当我们定义一个新的枚举时,不必应用DataContract特性,就可以在数 ... 
- DIV宽度自动缓慢变化
			<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ... 
- sqlplus链接数据库报ORA-09925: Unable to create audit trail file
			[localhost.localdomain]:[/oracle11/app/oracle11/product/11.2.0/dbhome_1/dbs]$ sqlplus / as sysdba SQ ... 
- VS2015 Xamarin for iOS
			VS2015环境配置 VS2015安装不多说.其实Xamarin 和微软感觉并不是什么好基友,Xamarin以前一直像个可怜的娃,以插件的形式寄生于VS中.现在只不过形势稍微好点了,VS2015 在明 ... 
- phpcms标签使用 —— 系统常量
			以下系统常量全局可用 1 2 3 4 5 6 7 8 9 10 11 12 13 CACHE_PATH 缓存文件夹地址 SITE_PROTOCOL 主机协议 SITE_URL 当前访问的主机名 HTT ... 
- C语言中main函数的参数
			转自:http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上, ... 
- 关于MFC  OpenGL环境配置的一点总结
			复制include时要小心..看vs给你load哪一个..名字一样..东西可不一定一样哦 http://www.cppblog.com/wicbnu/archive/2010/09/30/128123 ... 
- 解决mysql shell执行中文表名报command not found错误
			mysql -h 192.168.22.201 -uusername -ppassword --default-character-set=utf8 rom3 -e "DELETE FROM ... 
- 从零开始---控制台用c写俄罗斯方块游戏(1)
			从零开始---控制台用c写俄罗斯方块游戏(1) 很少写博文,一来自身知识有限,二来自己知道,已经有很多这样的博文了,三就是因为懒,文笔也一般,四来刚出来工作,时间也不多 之所以写这篇博文,是因为应群里 ... 
- ASP.Net MVC开发基础学习笔记(1):走向MVC模式
			一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ... 
