Telephone Lines

来源:互联网 发布:webpack优化 编辑:程序博客网 时间:2024/05/16 12:25

题目链接

题意:从1到n修一条电缆,有p条电缆可以连接,电话公司可以提供k条电缆,其他由john提供,求John提供的最长的电缆的长度,并使此长度尽量小。

可以用dijkstra算法,求出1到n走的最少的路的数量,设john支付的最长为L, 再用二分求得当路数>L的正好等于k时,此时L就是答案。

#define _CRT_SECURE_NO_WARNINGS#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cstdlib>#include <cmath>#include <iterator>#include <cctype>#include <sstream>#include <string>#include <vector>#include <set>#include <map>#include <stack>#include <deque>#include <queue>#include <list>#include <functional>#include <ctime>//#pragma comment(linker, "/STACK:102400000, 102400000")#define debug puts("+******************************************************+")#define Min(a, b) ( (a < b) ? a : b )#define Max(a, b) ( (a > b) ? a : b )#define lc o<<1#define rc o<<1|1#define mem0(x) memset(x, 0, sizeof x)#define mem1(x) memset(x, -1, sizeof x)#define memf(x) memset(x, false, sizeof x)#define pb push_back#define X first#define Y second#define m_p make_pair#define MAXS 50000 + 8#define MAXT 10000 + 8#define MAXL 500000 + 8#define INF 0x3f3f3f3f#define inf -(1<<30)#define EPS 1e-20#define PI acos(-1.0)using namespace std;typedef long long LL;typedef unsigned long long uLL;typedef double DB;typedef pair<int , int > pii;const int MOD = 1e9 + 7;const int N =  1000 + 1;const int maxn  = 1e6;int n,k, u, v, t, m, x , y, ans, p;int a, b, l, floyd[N][N];char  c;string s, s2;struct Edge{    int to, cost;    Edge() { }    Edge(int to, int cost) : to(to), cost(cost) { }};vector< Edge > G[N];int d[N];int V, E;int dijkstra(int x){    priority_queue<pii,  vector<pii>, greater<pii> > que; ///最小值优先    for (int i = 0;i <= n; i++) d[i] = INF;    d[1] = 0;    que.push(  pii(0, 1)  );    while ( !que.empty() ) {           pii p = que.top(); que.pop();           int v = p.Y;           if ( d[v] < p.X )continue;           for (int i = 0; i < G[v].size(); i++) {                Edge e = G[v][i];                int dd = d[v] + (e.cost >= x ? 1 : 0);                if ( d[e.to] > dd  ) {                     d[e.to] = dd;                     que.push( pii(d[e.to], e.to ) );                }           }    }    return d[V];}int main(){    scanf("%d%d%d", &n, &p, &k);    V = n;    E = p;    for (int i = 0;i < p; i++) {         scanf("%d%d%d", &a, &b, &l);         G[a].pb(  Edge(b, l) );         G[b].pb(  Edge(a, l) );    }    int low = 0, high = maxn + 9;    while ( low < high  - 1 ) {           int mm = low +  ((high - low) >> 1);           if ( dijkstra(mm ) > k ) low = mm;           else high = mm;    }    printf("%d\n",   low > maxn ?  -1 : low );    return 0;}


0 0
原创粉丝点击