• hiho_1139_二分+bfs搜索


    题目

        给定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;
    		}
    		else
    			beg = mid + 1;
    	}
    	int result = edges_len[beg];
    	printf("%d
    ", result);
    	return 0;
    }
    
  • 相关阅读:
    SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件+SpringBoot整合Mybatis-plus
    认证 (authentication) 和授权 (authorization) 的区别
    新手redis集群搭建
    Nginx是什么?
    分布式和集群的区别
    springBoot 项目 jar/war打包 并运行
    pyV8不支持dom操作,关于PyV8的支持DOM的疑问
    Python爬虫:更加优雅的执行JavaScript(PyV8)
    python中正则表达式 re.findall 用法
    Python爬虫-破解JS加密的Cookie
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/5689773.html
Copyright © 2020-2023  润新知