zoukankan      html  css  js  c++  java
  • 分层最短路

    #include <queue>
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int N = 1e4 + 10000;
    const int M = 1e5 + 10 ;
    int e[M] , ne[M] , h[N] , w[M] , idx ;
    int dis[N] ;
    bool st[M] ;
    int k  , n , p ;
    typedef pair<int , int> Pair ;
    void add(int a , int b , int c)
    {
        e[idx] = b , ne[idx] = h[a] , w[idx] = c , h[a] = idx ++ ;
    }
     
    void spfa()
    {
        queue<int> q ;
        memset(dis , 0x3f , sizeof dis) ;
        q.push(1) ;
        dis[1] = 0;
        st[1] = 1 ;
        while(q.size())
        {
            int u = q.front() ; 
            q.pop() ;
            st[u] = 0 ;
            for(int i = h[u] ;i != -1 ;i = ne[i])
            {
                int j = e[i] ;
                int maxn = max(dis[u] , w[i]) ;
                if(dis[j] > maxn)
                 {
                     dis[j] = maxn;
                     if(!st[j]) 
                      {
                          st[j] = 1 ;
                          q.push(j) ;
                      }
                 }
            }
        }
    }
     
    int main()
    {
        int n , p , k ;
        cin >> n >> p >> k ;
        memset(h , -1 , sizeof h) ;
        for(int i = 1 ;i <= p;i ++)
         {
             int a , b , c ;
             scanf("%d%d%d" , &a , &b , &c) ;
             add(a , b , c) , add(b , a , c) ;
             for(int j = 1 ;j <= k;j ++)
              {
                  add(a + n * j , b + n * j , c) ;
                  add(b + n * j , a + n * j , c) ;
                  add(a + n * (j - 1) , b + n * j , 0) ;
                  add(b + n * (j - 1) , a + n * j , 0) ;
              }
         }     
         for(int i = 1 ;i <= k ;i ++)
           add(i * n , (i + 1) * n , 0) ;
    // 上面这个其实是为了下面输出做一个方便,下面我贴一个不写这个代码的,其他的都是一样的,就只有这里做了一个处理
         spfa() ;
     
         printf("%d
    " , (dis[(k + 1) * n] == 0x3f3f3f3f ? -1 : dis[(k + 1)* n] )  ) ;
          
        return 0 ;
    }
    
    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int N = 2e5 + 10 ;
    int e[N * 2] , ne[N * 2] , h[N * 2] , w[N * 2] ;
    int dis[1100][1100] ;
    int idx ;
    bool st[1100] ;
    int k ;
    void add(int a , int b , int c)
    {
        e[++ idx] = b  , ne[idx] = h[a], w[idx] = c ,  h[a] = idx ;
    }
    void spfa()
    {
        memset(dis , 0x3f , sizeof dis) ;
        queue<int> q ;
        q.push(1) ;
        dis[1][0] = 0 ;
        st[1] = true ;
        while(q.size())
        {
            int u  = q.front() ;q.pop() ;
            st[u] = false ;
            for(int i = h[u] ; i != -1 ;i = ne[i])
            {
                int v = e[i] ;
                if(dis[v][0] > max(dis[u][0] , w[i])) 
                {
                    dis[v][0] = max(dis[u][0] , w[i]) ;
                    if(!st[v])
                     {
                        q.push(v) ;
                        st[v] = 1 ;
                     }
                }
                for(int p = 1 ;p <= k ;p ++)
                 {
                    if(dis[v][p] > min(dis[u][p - 1] , max(dis[u][p] , w[i])))
                     {
                        dis[v][p] = min(dis[u][p - 1] , max(dis[u][p] , w[i])) ;
                        if(!st[v])
                         {
                            q.push(v) ;
                            st[v] = 1;
                       }
                      }
                 }
            }
        }
    }
     
    int main()
    {
        int n , m ;
        memset(h , -1 , sizeof h) ;
        cin >> n >> m >> k ;
        for(int i = 1 ;i <= m ;i ++)
        {
            int a , b , c ;
            cin >> a >> b >> c ;
            add(a , b , c) , add(b ,a , c) ;
        }
        spfa() ;
        int res = 0x3f3f3f3f ;
        for(int i = 0 ;i <= k ;i ++)
         res = min(res , dis[n][i])  ;
        cout << (res == 0x3f3f3f3f ? -1 : res) << endl ; 
        return 0 ;
    }
    
    每次做题提醒自己:题目到底有没有读懂,有没有分析彻底、算法够不够贪心、暴力够不够优雅。
  • 相关阅读:
    PowerDesigner中Table视图同时显示Code和Name
    sql语句 生成数据库表
    业务流程图
    物理模型图-数据库图
    观察者模式
    UML的九种图
    路由器工作原理
    web项目中处理捕获异常统一处理
    java中volatile、synchronized
    linux 安装软件的几种方法
  • 原文地址:https://www.cnblogs.com/spnooyseed/p/12870902.html
Copyright © 2011-2022 走看看