zoukankan      html  css  js  c++  java
  • BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)

    描述


    http://www.lydsy.com/JudgeOnline/problem.php?id=1614

    分析


    类似POJ_3662_Telephone_Lines_(二分+最短路)

    Dijkstra:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=1000+5,maxm=10000+5,INF=1<<30;
     5 int n,m,k,ect;
     6 int hd[maxn],f[maxm],d[maxn];
     7 bool vis[maxn];
     8 struct edge{
     9     int to,w,next;
    10     edge(int to=0,int w=0,int next=0):to(to),w(w),next(next){}
    11     bool operator < (const edge &a) const { return w>a.w; }
    12 }g[maxm<<1];
    13 inline int read(int &x){ x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k; }
    14 inline void add_edge(int u,int v,int w){
    15     g[++ect]=edge(v,w,hd[u]); hd[u]=ect;
    16     g[++ect]=edge(u,w,hd[v]); hd[v]=ect;
    17 }
    18 inline bool C(int x){
    19     for(int i=1;i<=n;i++) d[i]=INF, vis[i]=false;
    20     d[1]=0;
    21     priority_queue <edge> q;
    22     q.push(edge(1,0,0));
    23     while(!q.empty()){
    24         int u=q.top().to; q.pop();
    25         if(vis[u]) continue;
    26         vis[u]=true;
    27         for(int i=hd[u];i;i=g[i].next){
    28             int v=g[i].to,duv=g[i].w>x?1:0;
    29             if(d[v]>d[u]+duv){
    30                 d[v]=d[u]+duv;
    31                 q.push(edge(v,d[v],0));
    32             }
    33         }
    34     }
    35     return d[n]<=k;
    36 }
    37 inline int bsearch(int l,int r){
    38     if(!C(f[r])) return-1;
    39     while(l<r){
    40         int mid=l+(r-l)/2;
    41         if(C(f[mid])) r=mid;
    42         else l=mid+1;
    43     }
    44     return f[l];
    45 }
    46 int main(){
    47     read(n); read(m); read(k);
    48     for(int i=1,u,v,w;i<=m;i++){
    49         read(u); read(v); read(w);
    50         add_edge(u,v,w);
    51         f[i]=w;
    52     }
    53     sort(f+1,f+1+m);
    54     printf("%d
    ",bsearch(0,m));
    55     return 0;
    56 }
    View Code

    Spfa:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=1000+5,maxm=10000+5,INF=1<<30;
     5 int n,m,k,ect;
     6 int hd[maxn],q[maxn],f[maxm],d[maxn];
     7 bool vis[maxn];
     8 struct edge{
     9     int to,w,next;
    10     edge(int to=0,int w=0,int next=0):to(to),w(w),next(next){}
    11 }g[maxm<<1];
    12 inline int read(int &x){ x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k; }
    13 inline void add_edge(int u,int v,int w){
    14     g[++ect]=edge(v,w,hd[u]); hd[u]=ect;
    15     g[++ect]=edge(u,w,hd[v]); hd[v]=ect;
    16 }
    17 inline bool C(int x){
    18     for(int i=1;i<=n;i++) d[i]=INF, vis[i]=false;
    19     d[1]=0,vis[1]=true;
    20     int l=0,r=0;
    21     q[r++]=1;
    22     while(l!=r){
    23         int u=q[l++]; if(l==maxn-1) l=0;
    24         vis[u]=false;
    25         for(int i=hd[u];i;i=g[i].next){
    26             int v=g[i].to,duv=g[i].w>x?1:0;
    27             if(d[v]>d[u]+duv){
    28                 d[v]=d[u]+duv;
    29                 if(!vis[v]){
    30                     q[r++]=v; if(r==maxn-1) r=0;
    31                     vis[v]=true;
    32                 }
    33             }
    34         }
    35     }
    36     return d[n]<=k;
    37 }
    38 inline int bsearch(int l,int r){
    39     if(!C(f[r])) return-1;
    40     while(l<r){
    41         int mid=l+(r-l)/2;
    42         if(C(f[mid])) r=mid;
    43         else l=mid+1;
    44     }
    45     return f[l];
    46 }
    47 int main(){
    48     read(n); read(m); read(k);
    49     for(int i=1,u,v,w;i<=m;i++){
    50         read(u); read(v); read(w);
    51         add_edge(u,v,w);
    52         f[i]=w;
    53     }
    54     sort(f+1,f+1+m);
    55     printf("%d
    ",bsearch(0,m));
    56     return 0;
    57 }
    View Code

     

  • 相关阅读:
    PLSQL表
    CentOS服务器下JavaEE环境搭建指南(远程桌面+JDK+Tomcat+MySQL)
    数据分析业务调研
    Apache -poi
    Python入门经典
    高性能Linux服务器构建实战:运维监控、性能调优与集群应用
    新编 中文版CorelDRAW入门与提高
    早该这样学!Photoshop比你想的简单
    跟老男孩学Linux运维:MySQL入门与提高实践
    SQL查询的艺术
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5602126.html
Copyright © 2011-2022 走看看