*【bzoj 1614】Telephone Lines架设电话线(二分+最短路)

来源:互联网 发布:东南亚境外旅游数据 编辑:程序博客网 时间:2024/06/05 10:55

传送门biu~
二分答案,找最短路使路径上大于答案的边不超过k条。

#include<bits/stdc++.h>using namespace std;int n,p,k;int head[1005],nex[20005],to[20005],v[20005],tp;inline void add(int x,int y,int z){    nex[++tp]=head[x];    head[x]=tp;    to[tp]=y;    v[tp]=z;}int dis[1005];bool in[1005];bool spfa(int p){    memset(dis,0x3f,sizeof(dis));    queue<int>q;    q.push(1);    dis[1]=0;in[1]=1;    while(!q.empty()){        int x=q.front();q.pop();in[x]=0;        for(int i=head[x];i;i=nex[i]){            int now=dis[x];            if(v[i]>p)  ++now;            if(now<dis[to[i]]){                dis[to[i]]=now;                if(!in[to[i]]){                    in[to[i]]=1;                    q.push(to[i]);                }            }        }    }    return dis[n]<=k;}int search(){    int re=-1;    int L=0,R=1000000;    while(L<=R){        int mid=L+R>>1;        if(spfa(mid))   re=mid,R=mid-1;        else            L=mid+1;    }    return re;}int main(){    scanf("%d%d%d",&n,&p,&k);    for(int i=1;i<=p;++i){        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        add(x,y,z);add(y,x,z);    }    printf("%d",search());    return 0;}
阅读全文
0 0
原创粉丝点击