程序笔记   发布时间:2022-07-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了洛谷P7297 [USACO21JAN] Telephone G 题解 分层图最短路大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

题目链接:https://www.luogu.com.cn/problem/P7297

解题思路:

对于每个颜色 (C),在第 (C) 层作出一条链,对于 (1 le i lt n)((i,C))((i,c+1)) 之间有一条权值为 (1) 的双向边。

((i,0))((i, b_i)) 连一条权值为 (0) 的有向边。 ​ 对于所有 (S_{C, b_i} = 1) 的颜色 (C),从 ((i,C)) 连向 ((i, 0)) 一条权值为 (0) 的有向边。

((1, 0)) 为起点 ((n, 0)) 为终点求最短路。

示例程序(需要开 O2 优化):

#include <bits/stdc++.h>
using namespace std;
const int maxn = 50050;

int n, K, b[maxn], dis[maxn * 55];
struct Edge {
    int v, w;
    Edge() {}
    Edge(int _v, int _w) { v = _v; w = _w; }
};
vector<Edge> g[maxn * 55];
char color[55][55];
bool vis[maxn * 55];

struct Node {
    int u, dis;
    bool operator < (const Node& b) const {
        return dis > b.dis;
    }
};
priority_queue<Node> que;

int ha(int u, int k) {
    return k * n + u;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie();
    cin >> n >> K;
    for (int i = 1; i < n; i ++) {
        for (int j = 1; j <= K; j ++) {
            g[ha(i, j)].push_BACk({ha(i+1, j), 1});
            g[ha(i+1, j)].push_BACk({ha(i, j), 1});
        }
    }
    for (int i = 1; i <= n; i ++) cin >> b[i];
    for (int i = 1; i <= K; i ++) cin >> color[i]+1;
    for (int i = 1; i <= n; i ++) {
        g[ha(i, 0)].push_BACk({ha(i, b[i]), 0});
        for (int j = 1; j <= K; j ++) if (color[j][b[i]] == '1') g[ha(i, j)].push_BACk({ha(i, 0), 0});
    }
    memset(dis, -1, sizeof(dis));
    que.push({ha(1, 0), 0});
    dis[ha(1, 0)] = 0;
    while (!que.empty()) {
        Node nd = que.top();
        que.pop();
        int u = nd.u, d = nd.dis;
        if (vis[u]) conTinue;
        vis[u] = true;
        if (u == ha(n, 0)) break;
        for (auto e : g[u]) {
            int v = e.v, w = e.w;
            if (dis[v] == -1 || dis[v] > d + w) {
                dis[v] = d + w;
                que.push({v, d+w});
            }
        }
    }
    cout << dis[ha(n, 0)] << endl;
    return 0;
}

大佬总结

以上是大佬教程为你收集整理的洛谷P7297 [USACO21JAN] Telephone G 题解 分层图最短路全部内容,希望文章能够帮你解决洛谷P7297 [USACO21JAN] Telephone G 题解 分层图最短路所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。