POJ3662通信线路

Posted magicduck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ3662通信线路相关的知识,希望对你有一定的参考价值。

题目链接:https://www.acwing.com/problem/content/description/342/

题目大意:给定一张无向带权图 , 求出 1 到 (n) 间的所有路径中第 (k + 1) 长的边的最小值

solution

二分最小所用的花费 (w) , 对于所有电缆 , 若花费大于 (w) , 则长度设为 (1) , 否则设为 (0) , 跑一遍 (1)

(n) 间的最短路 , 显然如果 1 到 (n) 的最短距离 如果小于等于 (k) , 那么就满足要求 , 否则就不满足

code

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &FF) {
    int RR = 1; FF = 0; char CH = getchar();
    for(; !isdigit(CH); CH = getchar()) if(CH == '-') RR = -RR;
    for(; isdigit(CH); CH = getchar()) FF = FF * 10 + CH - 48;
    FF *= RR;
}
inline void file(string str) {
    freopen((str + ".in").c_str(), "r", stdin);
    freopen((str + ".out").c_str(), "w", stdout);
}
const int N = 1e5 + 10;
int n, p, k;
int now, fst[N], nxt[N], num[N], wi[N];
void add(int u, int v, int w) {
    nxt[++now] = fst[u], fst[u] = now, num[now] = v, wi[now] = w;
    nxt[++now] = fst[v], fst[v] = now, num[now] = u, wi[now] = w;
}
int vis[N], st[N];
bool check(int ki) {
    memset(vis, 0, sizeof(vis));
    memset(st, 0x3f, sizeof(st));
    priority_queue<pair<int, int> > qi;
    qi.push(make_pair(0, 1)); st[1] = 0;
    while(!qi.empty()) {
        int pi = qi.top().second; qi.pop();
        if(vis[pi]) continue;
        vis[pi] = true; if(pi == n) break;
        for(int i = fst[pi]; i; i = nxt[i])
            if(st[pi] + (wi[i] > ki) < st[num[i]])
                st[num[i]] = st[pi] + (wi[i] > ki), qi.push(make_pair(-st[num[i]], num[i])); 
    }
    if(st[n] > k) return false;
    return true;
} 
int main() {
    //file("");
    int u, v, w, l = 0, r = 1e6, ans = -1;
    read(n), read(p), read(k);
    for(int i = 1; i <= p; i++)
        read(u), read(v), read(w), add(u, v, w);
    while(l <= r) {
        int mid = (l + r) >> 1;
        if(check(mid)) ans = mid, r = mid - 1;
        else l = mid + 1;
    }
    cout << ans << endl;
    return 0;
}

以上是关于POJ3662通信线路的主要内容,如果未能解决你的问题,请参考以下文章

poj3662 Telephone Lines

POJ3528 HDU3662 三维凸包模板

poj3662Telephone Lines——二分+最短路

POJ3662Telephone Lines(最短路+二分)

poj3662 Telephone Lines最短路二分

POJ 3662 (二分+SPFA