zoukankan      html  css  js  c++  java
  • Telephone Lines

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,m,k;
     4 const int maxn=1e6+10;
     5 const int maxm=9e6+10;
     6 const int inf=0x3f3f3f3f;
     7 struct Dijkstra
     8 {
     9     struct Edge
    10     {
    11         int next,  to ,w;
    12     } e[maxm];
    13     int head[maxn],v[maxn],d[maxn],tol;
    14     void add(int u, int v, int w)
    15     {
    16         tol++;
    17         e[tol].to = v;
    18         e[tol].next = head[u];
    19         e[tol].w = w;
    20         head[u] = tol;
    21     }
    22     priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
    23     int dijkstra(int s,int t)
    24     {
    25         memset(d,inf,sizeof(d));
    26         memset(v,0,sizeof(v));
    27         d[s] = 0;
    28         q1.push(make_pair(0, s));
    29         while (!q1.empty())
    30         {
    31             int x = q1.top().second;
    32             q1.pop();
    33             if (!v[x])
    34             {
    35                 v[x] = 1;
    36                 for (register int i = head[x]; i; i = e[i].next)
    37                 {
    38                     int to=e[i].to,k=max(e[i].w,d[x]);
    39                     if (d[to]>k){
    40                         d[to]=k;
    41                         q1.push(make_pair(d[to], to));
    42                     }
    43                 }
    44             }
    45         }
    46         return d[t];
    47     }
    48  
    49     void init()
    50     {
    51         memset(head, 0, sizeof(head));
    52         tol = 0;
    53     }
    54 } H;
    55  
    56  
    57 int main(){
    58     scanf("%d%d%d",&n,&m,&k);
    59     H.init();
    60     for (int i=1;i<=m;i++){
    61         int u,v,w;
    62         scanf("%d%d%d",&u,&v,&w);
    63         H.add(u,v,w);
    64         H.add(v,u,w);
    65         for (int j=1;j<=k;j++) {
    66             H.add(u+n*(j-1), v + j * n, 0);
    67             H.add(v+n*(j-1),  u+ j * n, 0);
    68             H.add(u+j*n,v+j*n,w);
    69             H.add(v+j*n,u+j*n,w);
    70         }
    71         for (int i=1;i<=k;i++){
    72             H.add(i*n,(i+1)*n,0);
    73         }
    74     }
    75     int ans=H.dijkstra(1,n*(k+1));
    76     if (ans==inf) printf("-1
    ");else printf("%d
    ",ans);
    77 }
    View Code

  • 相关阅读:
    今天地震了(有震感)...
    上班了!
    C++ 中explicit的作用
    DoModal 函数的用法
    [导入]C++ GUi 选择
    [导入]C++资源之不完全导引(完整版)[转]
    [导入]The GUI Toolkit, Framework Page
    [导入]C/C++中调用SQLITE3的基本步骤
    ACM
    牛客NOIP暑期七天营提高组5+普及组5
  • 原文地址:https://www.cnblogs.com/Accpted/p/11230782.html
Copyright © 2011-2022 走看看