海贼王之伟大航路解题报告

总时间限制: 1000ms   内存限制: 65536kB

描述

“我是要成为海贼王的男人!”,路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历程。

路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着“唯一的大秘宝”——ONE PIECE)。而航程中间,则是各式各样的岛屿。

因为伟大航路上的气候十分异常,所以来往任意两个岛屿之间的时间差别很大,从A岛到B岛可能需要1天,而从B岛到A岛则可能需要1年。当然,任意两个岛之间的航行时间虽然差别很大,但都是已知的。

现在假设路飞一行从罗格镇(起点)出发,遍历伟大航路中间所有的岛屿(但是已经经过的岛屿不能再次经过),最后到达拉夫德鲁(终点)。假设他们在岛上不作任何的停留,请问,他们最少需要花费多少时间才能到达终点?

输入

输入数据包含多行。
第一行包含一个整数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。

输出

输出为一个整数,代表路飞一行从起点遍历所有中间岛屿(不重复)之后到达终点所需要的最少的时间。

样例输入

样例输入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

样例输出

样例输出1:

100

样例输出2:

137

提示

提示:
对于样例输入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 题目分析

将题目分析得到,我们需要解决的是,遍历整个图的所有节点,然后求出最小其权值的最小值。

2 解题思路

由于整张图中的所有点默认标号为1-16,所以我们可以采用深度优先遍历的方式来遍历整张图,然后记录下用时最短的那个时间即可。

3 存在的问题

题目中所给最大的编号是16,遍历整张图需要进行16!次操作,时间太长,绝对超时。

4 解决方案

利用深度优先的方式,在其中进行剪枝操作。

剪枝分为两种:1 可行性剪枝 2 最优性剪枝。在这里我们只用到后者。

剪枝1 如果在进行深度优先时已经花费的时间大于了已有的最优时间,那么不进行接下来的操作。

剪枝2 记录从出发点1-某个点i的状态,当两个状态相同时,如果前者花费的时间少,那么后者不需要再进行操作。

比如 1-4

状态1 :1 2 3 4  花费时间 :5

状态2 :1 3 2 4  花费时间 :8

由于比较时,前者是已经走完的,那么当后者花费时间比较大的时候,我们直接采取前者的路线即可,不需要再进行自己的操作。

5 难点

如何进行状态的存储?

利用二维数组State[i][j];i表示现在走到的岛屿编号,j代表已经走过的路线。

也许你会问j怎么代表路线呢?

我们利用二进制来存储已经走过的路线,走过就将对应位置设为1,比如:

3:11->走过1-2,i代表的则是现在停留的岛屿 也就是2

问题解决代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

using namespace std;

#define N 17

#define INF 1<<30

int MinTime;

int n;

//存储状态

int State[16][32800];//中间状态存储

bool IsLandSign[17];

int IsLand[N][N];

int ct;

int Min(int a,int b)

{

return a<b?a:b;

}

void dfs(int IsLandNum,int AlreadyTime,int state)

{

int i;

IsLandSign[IsLandNum]=false;

ct++;

//返回条件

if(ct==n-1)

{

MinTime=Min(AlreadyTime+IsLand[IsLandNum][n],MinTime);

return;

}

//最优化剪枝

if(AlreadyTime>=MinTime)

return;

//中间状态最优化剪枝

if(AlreadyTime<State[IsLandNum][state] || State[IsLandNum][state]==-1)

State[IsLandNum][state]=AlreadyTime;

else

{

return;

}

for(i=1;i<n;i++)

{

if(IsLandSign[i]==true)

{

dfs(i,AlreadyTime+IsLand[IsLandNum][i],state+pow(2,i-1));

ct--;

IsLandSign[i]=true;

}

}

}

int main()

{

//freopen("in.txt","r",stdin);

int i,j;

while(~scanf("%d",&n))

{

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

scanf("%d",&IsLand[i][j]);

}

}

memset(IsLandSign,true,sizeof(IsLandSign));

memset(State,-1,sizeof(State));

ct=0;

MinTime=1<<30;

dfs(1,0,1);

cout<<MinTime<<endl;

}

return 0;

}

海贼王之伟大航路解题报告相关推荐

  1. POJ h0248.海贼王之伟大航路

    海贼王之伟大航路 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历程. 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿 ...

  2. 【算法练习】搜索/剪枝 百炼 poj4124:海贼王之伟大航路

    参考blog:http://blog.sina.com.cn/s/blog_a8efbf5d0102vo9u.html 题目链接:http://bailian.openjudge.cn/practic ...

  3. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  4. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  5. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  6. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  9. 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. 鸡啄米vc++2010系列32(标签控件Tab Control 下)
  2. 小程序十一:网络请求
  3. python【蓝桥杯vip练习题库】ADV-308递归输出
  4. thinkphp笔记
  5. 【Python教程】 正则表达式 re模块中,反斜杠 “\“分割字符串的正确操作方法
  6. 【STM32】STM32F4系统架构
  7. spring安全_Spring安全–幕后
  8. Java性能调优笔记
  9. Numbers on the Chessboard(CF-1027B)
  10. java并发临界资源管理
  11. 服务器系统2012u盘安装教程,windows2012 u盘安装教程
  12. 拍拍贷第三届“魔镜杯”启动:10万美金邀你“秀出你的算法!”
  13. win10远程控制+Android,win10实现手机远程控制电脑步骤分享
  14. Source Generator实战
  15. web服务器、应用服务器和常见的服务器概念
  16. 将word背景设成淡绿色方法
  17. 180127 逆向-JarvisOJ(BrokenDriver)(静态分析解法)
  18. iOS 13.2升级后:iPhone、iPad频繁杀后台,怎么解决呢?
  19. matlab ghm,matlab – 用Python中的matplotlib绘制许多数据点
  20. 2022年必须知道的数字化转型!

热门文章

  1. IE下载附件,文件大小超过10M后 无法下载
  2. [CC2642r1][syscfg] 中文图形化界面,方便快速熟悉工具使用
  3. Ayo!Drop the beats!我说中秋快乐,你说……
  4. 阿里云服务器配置参数详细说明文档
  5. 简述现代计算机系统如何进行多级划分,现代计算机系统是如何进行多级划分?...
  6. 华章1-2月份新书简介(2017年)
  7. 京东API网关实践之路
  8. 网红王思聪数字时钟动态壁纸【电脑壁纸】
  9. 龙——中华民族象征的
  10. python if continue的用法_Python continue语句用法实例