poj3662

来源:互联网 发布:sql酒店管理系统 编辑:程序博客网 时间:2024/06/04 23:05
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>using namespace std;int n,k,m;const int MAX_N  = 10010;const int INF = 1011111111;struct edge{        int v;        int cost;        edge(int _v, int _cost): v(_v),cost(_cost){}};vector <edge> E[MAX_N];void addedge(int u, int v, int w){        E[u].push_back(edge(v,w));}bool vis[MAX_N];int d[MAX_N];int spfa(int lim){        memset(vis, false, sizeof(vis));        for(int i = 0; i < n; i++)                 d[i] = INF;        vis[0] = true;        d[0] = 0;        queue<int> que;        while(!que.empty()) que.pop();        que.push(0);        while(!que.empty()){                int u = que.front(); que.pop();                vis[u] = false;                for(int i = 0;i < E[u].size(); i++){                        edge &e = E[u][i];                        int c = e.cost > lim ? 1 : 0;                        if(d[e.v] > d[u] + c){                                d[e.v] = d[u] + c;                                if(!vis[e.v]){                                        vis[e.v] = true;                                        que.push(e.v);                                }                        }                }        }        return d[n-1];}int main(){        scanf("%d%d%d", &n, &m, &k);        int x, y,z;        for(int i = 0;i < m; i++){                scanf("%d%d%d", &x, &y, &z);                addedge(x-1,y-1,z);                addedge(y-1,x-1,z);        }        int lb = -1, rb = INF;        while(rb - lb > 1){                int mid = (rb + lb) / 2;                if(spfa(mid) <= k)  rb = mid;                else lb = mid ;        }        if(rb == INF) rb = -1;        printf("%d\n", rb);        return 0;}


0 0