bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线

来源:互联网 发布:淘宝店铺无流量 编辑:程序博客网 时间:2024/06/06 00:53

题目

又是最小最大值问题,这显然是满足二分性质的。

二分最大值,把权值比它小的边新权值设为0,比它大的设为1。然后再跑一遍最短路,比较到n的距离与k的大小就好了。

#include<bits/stdc++.h>#define N 20000using namespace std;int n,p,k,l,r,mid,mn,x,y,z;int first[N+5],nxt[N+5],to[N+5],val[N+5],siz; int dis[N+5],vis[N+5],inf;inline char nc(){    static char buf[100000],*p1=buf,*p2=buf;    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline int read(){    int x=0,b=1;    char c=nc();    for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;    for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';    return x*b;}inline void add(int x,int y,int z){    nxt[siz]=first[x];    first[x]=siz;    to[siz]=y;    val[siz]=z;    siz++;}inline bool check(int mx){    memset(vis,false,sizeof(vis));    memset(dis,37,sizeof(dis)),inf=dis[0];    dis[1]=0,vis[1]=true;    queue <int> Q;Q.push(1);    while(!Q.empty())    {        int x=Q.front();Q.pop();vis[x]=false;        for(int i=first[x];i!=-1;i=nxt[i])        {            int u=to[i];            if(dis[u]>dis[x]+(val[i]>mx))            {                dis[u]=dis[x]+(val[i]>mx);                if(vis[u])continue;                vis[u]=true,Q.push(u);            }        }    }    if(dis[n]<=k)return true;    return false;} int main(){    freopen("in.txt","r",stdin);    n=read(),p=read(),k=read();    memset(first,-1,sizeof(first));    for(int i=1;i<=p;i++)        x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z);    mn=~0u>>1;    l=0,r=1000000;    while(l<=r)    {        mid=(l+r)/2;        if(check(mid))mn=min(mn,mid),r=mid-1;        else l=mid+1;    }    cout<<(mn==~0u>>1?-1:mn);    return 0;}
阅读全文
0 0
原创粉丝点击