这道题目如果数据很小的话。我们通过这个dfs就可以完成深搜:


void dfs(int s)
{if (s==N){minLen=min(minLen,totalLen);return ;}for (int i=0;i<G[s].size();i++){Road r=G[s][i];if (r.t+totalCost>K)continue;if (!visited[r.d]){visited[r.d]=1;totalLen+=r.L;totalCost+=r.t;dfs(r.d);totalCost-=r.t;totalLen-=r.L;visited[r.d]=0;}}
}

我们可以看一下这个代码,意思就是说,如果找边的时候,我们已经搜索到了终点,也就是s==N的时候,我们就直接改写minLen,然后返回到上一层,进行totalCost,totalLen和visited数组的返回工作,因为我们这次走的是这一条路,当我们返回的时候,就将这条路的终点标记全部还原,因为从这条路的起始点还可能会有其它的路,如果不把它还原的话,其它的路就被封死了,深搜就无法进行的很完全了,不能说是遍历了。

我们对于以s为起点的边进行遍历,发现边r的花费加上之前的总花销已经超过K,总钱数了,我们就跳过这一条边,这是第一次剪枝。

如果我们没有访问过边r的终点d时,我们就把它访问位设置为1,总路程加上r边长,总花费加上r边的过路费,然后深搜d。

这是可以通过一些较小的数据的,但是这道题中的数据很大,而dfs中又做了很多的无用功,所以我们进行以下的剪枝:

如果d点没有被访问过,我们就判断如果这次走到点d的时候,总路程已经超过minLen了,也就是之前找到的最短路,我们就跳过这个终点的深搜,我们直接不走这条路了。

这个剪枝还是不够,所以我们拿空间换取时间,我们设置一个minL[110][10010]数组,minL[k][m]表示之前走到点k并且花费为m的最短长度。

如果我们这次走到点k,并且花销为m,但是我们的路程已经大于这个最短长度了,我们就跳出这重循环,执行循环的下一次。

因为它的意思,也就是说,我们每走过一个点,我们就进行一次比较,确保我们不花相同的钱,走更远的路,这个剪枝极为有效,直接可以过。

代码如下:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int N,K,R;
struct Road {int d,L,t;
};
vector < vector<Road> > G(110);int minLen;
int minL[110][10010];
int totalLen;
int totalCost;
int visited[110];void dfs(int s)
{if (s==N){minLen=min(minLen,totalLen);return ;}for (int i=0;i<G[s].size();i++){Road r=G[s][i];if (r.t+totalCost>K)continue;if (!visited[r.d]){if (totalLen+r.L>=minLen)continue;if (totalLen+r.L>=minL[r.d][r.t+totalCost])continue;visited[r.d]=1;totalLen+=r.L;minL[r.d][r.t+totalCost]=totalLen;totalCost+=r.t;dfs(r.d);totalCost-=r.t;totalLen-=r.L;visited[r.d]=0;}}
}int main()
{cin>>K>>N>>R;for (int i=0;i<R;i++) {int s;Road r;cin>>s>>r.d>>r.L>>r.t;if (s!=r.d) {G[s].push_back(r);}}memset(visited,0,sizeof(visited));for (int i=0;i<110;i++) {for (int j=0;j<10010;j++) {minL[i][j]=1<<30;}}totalLen=0;totalCost=0;minLen=1<<30;visited[1]=1;dfs(1);if (minLen<(1<<30))cout<<minLen<<endl;else cout<<-1<<endl;return 0;
}

转载于:https://www.cnblogs.com/xyqxyq/p/10211350.html

POJ-1724 深搜剪枝相关推荐

  1. NOI 4.5 动态规划 4979:海贼王之伟大航路(深搜剪枝)

    题目来源:http://noi.openjudge.cn/ch0405/4979/ 4979:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼 ...

  2. Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝)

    Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝) 一.问题描述 1.五子棋 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋的棋具与围棋通用,是一种传 ...

  3. hdu 3812 Sea Sky 深搜+剪枝

    题目意思: 从sea 找一条道sky 的最长路 题解: 先进行一系列的预处理 1.将所有不重复的字符串先保留下来,然后从小到大排序,这样深搜的时候最先弄出来的答案就是最小的 字母序. 2. 进行深度优 ...

  4. POJ 1562深搜判断连体油田个数

    http://poj.org/problem?id=1562 大意:输入mp二维矩阵,规定'@'连体的包括对角线为一片油田,统计共有多少油田.深搜方向数组dir设置8个方向遇到@继续搜索把当前位置赋值 ...

  5. 一本通例题-生日蛋糕——题解超强深搜剪枝,从无限到有限

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  6. ACM 海贼王之伟大航路(深搜剪枝)

    "我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...

  7. LeetCode 1240. 铺瓷砖(深搜剪枝)

    1240. 铺瓷砖 你是一位施工队的工长,根据设计师的要求准备为一套设计风格独特的房子进行室内装修. 房子的客厅大小为 n x m,为保持极简的风格,需要使用尽可能少的 正方形 瓷砖来铺盖地面. 假设 ...

  8. POJ2044 深搜+剪枝(云彩下雨)

    题意:        有一个城镇,是4*4的大小的,然后你控制一块云彩,2*2的,你每天可以有9种走的方法,上下左右,或者不动,走的时候可以走1或者2步,云彩所在的地方肯定会下雨,然后给你做多365天 ...

  9. POJ - 1190 - 生日蛋糕 (深搜剪枝)

    链接: http://poj.org/problem?id=1190 思路: 剪枝. 1.从半径n+1开始 2.当前已有表面积,加上剩余的预估最小表面积,若大于最优解,减掉.(什么是预估最小解?高度每 ...

最新文章

  1. MVC验证10-到底用哪种方式实现客户端服务端双重异步验证
  2. charshow技术预研
  3. 网络招聘“草莽时代”该结束了
  4. 蓝牙mesh — 解密蓝牙mesh系列文章汇总
  5. 计算机python技术基础知识点_python基础--相关计算机基础知识
  6. Python爬虫爬取美剧网站
  7. Facebook Graph API(2)--读取数据之picture
  8. 小程序初始化服务器数据,微信小程序 项目实战(一)生命周期 配置服务器信息 splash启动页...
  9. 【实践】网易云音乐推荐中用户行为序列深度建模.pdf(附下载链接)
  10. nlp-tutorial代码注释3-1,RNN简介
  11. PHP中去除换行解决办法小结(PHP_EOL)
  12. 阿里云云计算 29 AS的原理
  13. 江苏省淮安市谷歌高清卫星地图下载
  14. 阿里云首席安全研究员吴翰清:我人生的两次选择
  15. docker安装gamit_科学网-基于Ubuntu18.04安装Gamit10.71-郭若成的博文
  16. 多传感器融合定位 第十章 基于优化的定位方法
  17. 3G模块SIM5360E拨号上网
  18. 【优化算法】加权黑猩猩优化算法(WChOA)(Matlab代码实现)【与ChOA、PSO、WOA、BH、ALO、GA和GWO算法比较】
  19. 利用PYTHON连接阿里云物联网平台
  20. vue中请求到的数据赋值给data 对象

热门文章

  1. Android自己定义组件系列【6】——进阶实践(3)
  2. Interface继承至System.Object?
  3. 看懂此文 你离赚钱就不远了
  4. 剑破冰山—Oracle开发艺术 前言
  5. 我为什么更喜欢 Mac OS X
  6. 使用component小程序
  7. java基础-迭代器(Iterator)与增强for循环
  8. 机房墙面为什么要做保温?该怎么做?
  9. Google的其他用法
  10. 我的jQuery动态表格插件二