ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷P7297 [USACO21JAN] Telephone G 题解 分层图最短路

2021-11-16 22:33:34  阅读:178  来源: 互联网

标签:USACO21JAN 洛谷 int 题解 55 maxn 权值 const dis


题目链接: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;
}

标签:USACO21JAN,洛谷,int,题解,55,maxn,权值,const,dis
来源: https://www.cnblogs.com/quanjun/p/15564130.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有