1 条题解

  • 1
    @ 2023-10-21 10:19:57

    还是使用Dijkstra(参见P1023题解)

    分层图就是把一张图分成多层,每层之间用有向\(0\)边权的边连接起来。
    假设一个顶点\(u\)在本层连接了顶点\(v_1, v_2\),那么从这个顶点出发还应该连到下一层的\(v_{n+1}, v_{n+2}\)顶点,且是有向无权边。

    下面给出具体连边方式:

    // 只给出main函数写法,剩下的参考P1023题解
    int main(){
        cin>>n>>m>>k;
        cin>>s>>t;
        for(int i=0, u, v, w; i<m; i++){
            cin>>u>>v>>w;
            add(u, v, w);
            add(v, u, w); // 无向边
            for(int j=1; j<=k; j++){ // 从1~k层依次建图
                add(u + j * n, v + j * n, w); // 连接第j层中的u, v节点
                add(v + j * n, u + j * n, w);
                add(u + j * n - n, v + j * n, 0); // 连接第j-1层的u节点到第j层的v节点,单向无权
                add(v + j * n - n, u + j * n, w); // 连接第j-1层的v节点到第j层的u节点,单向无权
            }
        }
        Dijkstra();
        int ans = INF;
        for(int j=0; j<=k; j++)
            ans = min(ans, dis[t + j * n]; // 最终的答案可能在某一层的终点上,而不是最后一层!
        cout<<ans<<endl;
        return 0;
    }
    
  • 1

飞行路线 / 【模板】分层图最短路

信息

ID
1024
难度
1
分类
图结构 | 最短路 点击显示
标签
递交数
0
已通过
0
通过率
?
上传者