日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

hiho_1139_二分+bfs搜索

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;}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搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。