1 条题解
-
1XzyStudio (admin) LV 8 MOD RP++ 机房蒟蒻 tayz @ 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