제출 #1355271

#제출 시각아이디문제언어결과실행 시간메모리
1355271gay철도 요금 (JOI16_ho_t3)C++20
100 / 100
84 ms16632 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <random>

//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
}

void solve() {
    int n, m, q;
    cin >> n >> m >> q;

    vector<pair<int, int>> edges(m);
    vector<vector<int>> g(n);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        u--; v--;
        g[u].push_back(v);
        g[v].push_back(u);
        edges[i] = {u, v};
    }

    vector<int> dist(n, -1);
    queue<int> bfs;
    bfs.push(0);
    dist[0] = 0;

    while (!bfs.empty()) {
        int v = bfs.front();
        bfs.pop();
        for (auto u : g[v]) {
            if (dist[u] == -1) {
                dist[u] = dist[v] + 1;
                bfs.push(u);
            }
        }
    }

    vector<vector<int>> dag_out(n);
    vector<int> in_degree(n, 0);
    vector<int> dag_u(m, -1), dag_v(m, -1);

    for (int i = 0; i < m; i++) {
        int u = edges[i].first, v = edges[i].second;
        if (dist[v] == dist[u] + 1) {
            dag_out[u].push_back(i);
            in_degree[v]++;
            dag_u[i] = u;
            dag_v[i] = v;
        } else if (dist[u] == dist[v] + 1) {
            dag_out[v].push_back(i);
            in_degree[u]++;
            dag_u[i] = v;
            dag_v[i] = u;
        }
    }

    vector<bool> broken_node(n, false);
    vector<bool> broken_edge(m, false);
    int ans = 0;

    auto break_node = [&](int start_v, auto& self) -> void {
        queue<int> q_break;
        broken_node[start_v] = true;
        ans++;
        q_break.push(start_v);

        while (!q_break.empty()) {
            int curr = q_break.front();
            q_break.pop();

            for (int edge_id : dag_out[curr]) {
                if (!broken_edge[edge_id]) {
                    broken_edge[edge_id] = true;
                    int next_v = dag_v[edge_id];

                    if (!broken_node[next_v]) {
                        in_degree[next_v]--;
                        if (in_degree[next_v] == 0) {
                            broken_node[next_v] = true;
                            ans++;
                            q_break.push(next_v);
                        }
                    }
                }
            }
        }
    };

    for (int i = 0; i < q; i++) {
        int id;
        cin >> id;
        id--;

        if (dag_u[id] != -1 && !broken_edge[id]) {
            broken_edge[id] = true;
            int v = dag_v[id];

            if (!broken_node[v]) {
                in_degree[v]--;
                if (in_degree[v] == 0) {
                    break_node(v, break_node);
                }
            }
        }
        cout << ans << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...