分层最短路

#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\n" , (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 ;
}
全部评论

相关推荐

11-14 16:18
四川大学 Java
牛6646848154:眼睛有点小,建议P大点
点赞 评论 收藏
分享
程序员小白条:投太少了,多投点吧,二本就海投,然后简历上加点奖项或者四六级之类的,别管有没有用,另外最好搞下个人博客,定期输出一些文章和学习总结,也可以去github参与一下开源项目提一些PR,总会有中小公司看的上的
点赞 评论 收藏
分享
12-19 21:56
已编辑
中山大学 Java
灵犀互娱 中台组 1085
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务