zoukankan      html  css  js  c++  java
  • CF187C Weak Memory 题解 二分答案+优先队列广搜

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

    解题思路:

    首先要求最小的 (q) ,考虑二分 (q)

    (q) 确定的情况下,使用 BFS 可以得到从 (s)(t) 是否连通,但是因为这里我其实希望到达每个节点的时候能量值尽可能地大,所以使用优先队列,优先遍历到达该点的时候能量值最大的状态。

    示例代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010, maxm = 200020;
    struct Edge {
        int v, nxt;
        Edge() {};
        Edge(int _v, int _nxt) { v = _v; nxt = _nxt; }
    } edge[maxm<<1];
    int n, m, k, s, t, head[maxn], ecnt;
    bool isvolunteer[maxn];
    void init() {
        ecnt = 0;
        memset(head, -1, sizeof(int)*(n+1));
    }
    void addedge(int u, int v) {
        edge[ecnt] = Edge(v, head[u]); head[u] = ecnt ++;
        edge[ecnt] = Edge(u, head[v]); head[v] = ecnt ++;
    }
    struct Node {
        int u, val;
        Node() {};
        Node(int _u, int _val) { u = _u; val = _val; }
        bool operator < (Node b) const {
            return val < b.val;
        }
    };
    priority_queue<Node> que;
    int dis[maxn];
    bool check(int q) {
        while (!que.empty()) que.pop();
        memset(dis, -1, sizeof(int)*(n+1));
        dis[s] = q;
        que.push(Node(s, q));
        while (!que.empty()) {
            Node nd = que.top();
            que.pop();
            int u = nd.u, val = nd.val;
            if (val == 0) continue;
            for (int i = head[u]; i != -1; i = edge[i].nxt) {
                int v = edge[i].v, val2 = val - 1;
                if (isvolunteer[v]) val2 = q;
                if (v == t) return true;
                if (dis[v] < val2) {
                    dis[v] = val2;
                    que.push(Node(v, val2));
                }
            }
        }
        return false;
    }
    void solve() {
        int L = 1, R = n, res = -1;
        while (L <= R) {
            int mid = (L + R) / 2;
            if (check(mid)) {
                res = mid;
                R = mid - 1;
            }
            else L = mid + 1;
        }
        printf("%d
    ", res);
    }
    int main() {
        scanf("%d%d%d", &n, &m, &k);
        for (int i = 0; i < k; i ++) {
            int a;
            scanf("%d", &a);
            isvolunteer[a] = true;
        }
        init();
        while (m --) {
            int a, b;
            scanf("%d%d", &a, &b);
            addedge(a, b);
        }
        scanf("%d%d", &s, &t);
        solve();
        return 0;
    }
    
  • 相关阅读:
    jQuary学习の三の效果展示
    jQuary学习の二の语法
    jQuary学习の一の初期准备
    js备战春招の四のjs函数
    javascript JSON
    js备战春招の四の表单
    js备战春招の四の严格模式
    290. Word Pattern--Easy
    546. Remove Boxes--Hard
    牛客网-华为-2020届校园招聘上机考试-3
  • 原文地址:https://www.cnblogs.com/quanjun/p/13849153.html
Copyright © 2011-2022 走看看