• 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

     

  • 相关阅读:
    public static void Invoke (Action action)
    C#编写WIN32系统托盘程序
    C#的互操作性:缓冲区、结构、指针
    SQLServer异步调用,批量复制
    Python体验(10)-图形界面之计算器
    Python体验(09)-图形界面之Pannel和Sizer
    Python体验(08)-图形界面之工具栏和状态栏
    Python体验(07)-图形界面之菜单
    C#利用WIN32实现按键注册
    Javascript猜数字游戏
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5602126.html
Copyright © 2020-2023  润新知