Submission #1243850

#TimeUsernameProblemLanguageResultExecution timeMemory
1243850longggggCommuter Pass (JOI18_commuter_pass)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

#define Longgggg ios_base::sync_with_stdio(0); cin.tie(0);
#define ll long long
#define endl '\n'
#define fi first
#define se second

const ll INF = 1e18;
const int mxN = 1e5 + 5;

int N, M, S, T, U, V;
vector<tuple<int, int, int>> edges;
vector<pair<int, int>> adj[mxN];

vector<ll> dijkstra(int start, const vector<vector<pair<int, int>>>& g) {
    vector<ll> dist(N + 1, INF);
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    dist[start] = 0;
    pq.emplace(0, start);
    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if (d > dist[u]) continue;
        for (auto &[v, cost] : g[u]) {
            if (dist[v] > dist[u] + cost) {
                dist[v] = dist[u] + cost;
                pq.emplace(dist[v], v);
            }
        }
    }
    return dist;
}

vector<vector<pair<int, int>>> shortest_path_graph(mxN);
vector<vector<int>> all_paths;
vector<int> current_path;

void dfs(int u, int t, vector<bool>& visited) {
    if (u == t) {
        all_paths.push_back(current_path);
        return;
    }
    visited[u] = true;
    for (auto &[v, id] : shortest_path_graph[u]) {
        if (!visited[v]) {
            current_path.push_back(id);
            dfs(v, t, visited);
            current_path.pop_back();
        }
    }
    visited[u] = false;
}

void solve() {
    cin >> N >> M;
    cin >> S >> T;
    cin >> U >> V;

    edges.resize(M);
    FOR(i, 0, M - 1) {
        int a, b, c;
        cin >> a >> b >> c;
        edges[i] = {a, b, c};
        adj[a].emplace_back(b, c);
        adj[b].emplace_back(a, c);
    }

    auto distS = dijkstra(S, adj);
    auto distT = dijkstra(T, adj);
    ll shortest = distS[T];

    // Xây dựng đồ thị chỉ gồm các cạnh trên ít nhất 1 đường đi ngắn nhất
    for (int i = 0; i < M; ++i) {
        auto [a, b, c] = edges[i];
        if (distS[a] + c + distT[b] == shortest || distS[b] + c + distT[a] == shortest) {
            shortest_path_graph[a].emplace_back(b, i);
            shortest_path_graph[b].emplace_back(a, i);
        }
    }

    // Truy vết tất cả các đường đi từ S đến T bằng DFS
    vector<bool> visited(N + 1, false);
    dfs(S, T, visited);

    ll ans = INF;

    for (auto& path_ids : all_paths) {
        // Tạo graph mới với commuter pass là các cạnh trên đường đi hiện tại
        vector<vector<pair<int, int>>> newG(N + 1);
        unordered_set<int> pass_edges(path_ids.begin(), path_ids.end());

        for (int i = 0; i < M; ++i) {
            auto [a, b, c] = edges[i];
            int cost = (pass_edges.count(i) ? 0 : c);
            newG[a].emplace_back(b, cost);
            newG[b].emplace_back(a, cost);
        }

        auto d = dijkstra(U, newG);
        ans = min(ans, d[V]);
    }

    cout << ans << endl;
}

int main() {
    if (fopen("A.in", "r")) {
        freopen("A.in", "r", stdin);
        freopen("A.out", "w", stdout);
        freopen("debug.out", "w", stderr);
    }
    Longgggg
    solve();
    return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void solve()':
commuter_pass.cpp:61:9: error: 'i' was not declared in this scope
   61 |     FOR(i, 0, M - 1) {
      |         ^
commuter_pass.cpp:61:5: error: 'FOR' was not declared in this scope
   61 |     FOR(i, 0, M - 1) {
      |     ^~~
commuter_pass.cpp:69:30: error: invalid initialization of reference of type 'const std::vector<std::vector<std::pair<int, int> > >&' from expression of type 'std::vector<std::pair<int, int> > [100005]'
   69 |     auto distS = dijkstra(S, adj);
      |                              ^~~
commuter_pass.cpp:17:70: note: in passing argument 2 of 'std::vector<long long int> dijkstra(int, const std::vector<std::vector<std::pair<int, int> > >&)'
   17 | vector<ll> dijkstra(int start, const vector<vector<pair<int, int>>>& g) {
      |                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
commuter_pass.cpp:70:30: error: invalid initialization of reference of type 'const std::vector<std::vector<std::pair<int, int> > >&' from expression of type 'std::vector<std::pair<int, int> > [100005]'
   70 |     auto distT = dijkstra(T, adj);
      |                              ^~~
commuter_pass.cpp:17:70: note: in passing argument 2 of 'std::vector<long long int> dijkstra(int, const std::vector<std::vector<std::pair<int, int> > >&)'
   17 | vector<ll> dijkstra(int start, const vector<vector<pair<int, int>>>& g) {
      |                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:109:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |         freopen("A.in", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:110:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |         freopen("A.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:111:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |         freopen("debug.out", "w", stderr);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~