题目

给定N个点和M条边,从点1出发,到达点T。寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值。 
题目链接:二分 
    最小化最大值,考虑采用二分搜索。对所有的边长进行排序,二分,对每次选择的边长,判断是否存在一条路径满足路径上所有的边长度均小于等于该边长,且路径中的边的个数小于等于K。 
    在判断路径是否存在的时候,使用BFS搜索,因为BFS用于寻找最短(边的个数最少)路径。

实现

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
using namespace std;
struct Edge{int to;int dist;int next;
};
//边的个数,开始的时候数组开的长度为 100005, hihocoder上提示 TLE,实际应该为 RE!!!
//数组开到 200005,就AC了
Edge gEdges[200005];
int gHead[10005];
bool gVisited[10005];
int gEdgeIndex;
void Init(){gEdgeIndex = 0;memset(gEdges, -1, sizeof(gEdges));memset(gHead, -1, sizeof(gHead));memset(gVisited, false, sizeof(gVisited));
}
void InsertEdge(int u, int v, int d){int e = gEdgeIndex++;gEdges[e].to = v;gEdges[e].dist = d;gEdges[e].next = gHead[u];gHead[u] = e;
}
struct Node{int id;int step;Node(int i = 0, int s = 0) :id(i), step(s){};
};
//BFS 搜索,寻找从点1到达点boss的路径,要求路径上的所有边的长度都小于等于max_d,且路径长度最大为k
//判断能否找到满足要求的路径
bool Arrive2Boss(int boss, int max_d, int k){queue<Node> Q;Node node(1, 1);Q.push(node);memset(gVisited, false, sizeof(gVisited));while (!Q.empty()){node = Q.front();Q.pop();if (node.id == boss)return true;if (gVisited[node.id])continue;gVisited[node.id] = true;for (int e = gHead[node.id]; e != -1; e = gEdges[e].next){int v = gEdges[e].to;if (!gVisited[v] && gEdges[e].dist <= max_d && node.step <= k){Q.push(Node(v, node.step + 1));}}}return false;
}
int edges_len[100005];
int main(){int N, M, K, T, u, v, d;Init();scanf("%d %d %d %d", &N, &M, &K, &T);for (int i = 0; i < M; i++){scanf("%d %d %d", &u, &v, &d);InsertEdge(u, v, d);InsertEdge(v, u, d);edges_len[i] = d;}//对路径进行排序sort(edges_len, edges_len + M);int beg = 0, end = M;//二分查找while (beg < end){int mid = (beg + end) / 2;int max_d = edges_len[mid];if (Arrive2Boss(T, max_d, K)){end = mid;}elsebeg = mid + 1;}int result = edges_len[beg];printf("%d\n", result);return 0;
}

转载于:https://www.cnblogs.com/gtarcoder/p/5689773.html

hiho_1139_二分+bfs搜索相关推荐

  1. java灌水bfs二叉树,二叉树的BFS搜索

    本人需要阅读代码,如果觉得阅读困难可以一步到CSDN 代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在本人的另一篇博客通过树的中序和先序遍历生成二叉树中进行了详细讲解. 广度优先搜索算法( ...

  2. 4. 对称飞行器 -- BFS搜索

    对称飞行器 小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的到达终点. 每一次他可以选择花费一个时间单位向上或向下或向左或向右走一格,或是使用自己的对称飞行器花费一个时间单位 ...

  3. 【CCCC】L3-008 喊山 (30分),BFS搜索最长路,水题

    problem L3-008 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中 ...

  4. 【牛客 - 318F】关于我转生变成史莱姆这档事(二分,搜索)

    题干: 有一天,利姆鲁在这个世界最重要的人静被魔王带走,并将其困在一个n*n的迷宫内的某一处,迷宫的每个格子都可能有一只魔物,魔物的攻击力为a[i][j],因而利姆鲁只有当攻击力大于等于a[i][j] ...

  5. (二分+区间搜索 )Mountain Walking(poj2110/poj2922)

    题目 农夫约翰和贝西牛已经开始了其中一个"积极"的假期.他们整天都在山里散步,然后在一天结束时,他们厌倦了回到度假小屋. 由于攀爬需要大量能量并且已经疲惫,他们希望使用其最高和最低 ...

  6. [USACO13FEB]Tractor【二分 + BFS】

    Pro Luogu3073 Sol 好水的一道题啊--直接二分答案就可以过,不需要并查集的,二分加广搜,时间复杂度是O(n^2 logM),能过的. 读完题,我们很容易的就能知道,答案满足单调性,也就 ...

  7. HDU - 2612 Find a way(BFS搜索)

    题目: 链接 思路: 用BFS分别以'Y'和'M'的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到'@'更行最小值. PS: 如果用'Y'和'M'点分别去搜每个 ...

  8. HDU 5652 India and China Origins(二分 + BFS)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398867.html 题意: 中国和印度之间有一片地方,把这片地方抽象化,于是就可以看成一个N * M矩阵,其中黑色的代表 ...

  9. 二分+BFS——刺杀大使(洛谷 P1902)

    题目选自洛谷P1902 我们在题面中看到了最大值最小 这五个字. 很容易就想到了二分答案. 同时题目涉及图,以及只能从四个方向,所以想到了BFS的解法 将这两种方法一起使用,就得到了答案! 题目描述 ...

最新文章

  1. 如何初始化静态地图?
  2. 1142 CREATE VIEW command denied to user 'blog'@'XXX.XXX.XXX.XXX' for table 'Articles'
  3. python学哪个版本-我现在应该学习哪个版本的Python?哪个方向更好?
  4. VS中一些提高编码效率的快捷键
  5. Maven入门学习,安装及创建项目
  6. Netty实战一之异步和事件驱动
  7. 799元首发!小米手表Color:14天超长续航、专业运动健康管理
  8. C#创建自定义配置节点
  9. 大快DKH大数据网络爬虫安装教程(详细图文步骤)
  10. ES6之导入模块时的内存共享
  11. 怎样彻底卸载电脑上的软件
  12. 上海安陆FPGA程序下载
  13. 对话张冬洪 | 全面解读NoSQL数据库Redis的核心技术与应用实践
  14. 智能硬件产品盈利模式
  15. Mysql导出数据库设计文档
  16. 快手616购物节报告:品牌商家GMV同比增长超5倍
  17. USB gadget driver framework
  18. 光伏电站清扫机器人_光伏清扫机器人(GF01B)
  19. windows子系统ubuntu远程桌面连接
  20. 什么是开源生态?———— 《硅谷生态圈》书评

热门文章

  1. python3-pwntools教程_python的pwntools工具的日常使用
  2. C++调用Python文件,TensorFlow和PyTorch构建的深度学习模型,无法使用GPU的情况分析。
  3. python turtle画滑稽_使用python的turtle函数绘制一个滑稽表情的方法
  4. c语言中求一个数的因数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  5. cmake开发环境 linux qt_一步步搭建CMake+QT+VTK+BOOST开发环境
  6. vue 怎么全局到入常量_午后躺椅上看关于Vue的20点
  7. 利用c语言检测气体浓度,一氧化碳气体检测仪的算法设计
  8. Linux C程序命令行传参
  9. python install scikit-image后,报错ImportError: DLL load failed: 找不到指定的模块
  10. 【面向对象编程】(1) 类实例化的基本方法