poj3662 dij

来源:互联网 发布:sql酒店管理系统 编辑:程序博客网 时间:2024/06/05 09:54
#include <cstdio>#include <algorithm>#include <cstring>#include <vector>#include <queue>using namespace std;#define MAX_N 11000#define INF 1000000000int n,m,k;struct edge{        int to;        int cost;        edge(int _to, int _cost): to(_to), cost(_cost){}};typedef pair<int, int> P;vector<edge> G[MAX_N];int d[MAX_N];void addedge(int u,int v,int t){        G[u].push_back(edge(v, t));}int dij(int x){        priority_queue<P , vector<P>, greater<P> > que;        fill(d, d + n, INF);        d[0] = 0;        que.push(P(0, 0));        while(!que.empty()){                P p = que.top(); que.pop();                int v = p.second;                if(d[v] < p.first) continue;                for(int i = 0;i < G[v].size();i++){                        edge &e = G[v][i];                        int c = e.cost > x ? 1 : 0;                        if(d[e.to] > d[v] + c){                                d[e.to] = d[v] + c;                                que.push(P(d[e.to], e.to));                        }                }                }        return d[n-1];}int  solve(){        int lb = -1, ub = 1000001;        while(ub - lb > 1){                int mid = (lb + ub) / 2;                if(dij(mid) <= k) ub = mid;                else lb = mid;        }        return (ub == 1000001 ? -1 : ub);    }int main(){        scanf("%d%d%d", &n, &m, &k);        int u,v,t;        for(int i = 0;i < m; i++){                scanf("%d%d%d",&u, &v, &t);                addedge(u-1, v-1, t);                addedge(v-1, u-1, t);        }        int ans = solve();        printf("%d\n", ans);        return 0;}

0 0
原创粉丝点击