Submission #226161

# Submission time Handle Problem Language Result Execution time Memory
226161 2020-04-22T17:09:38 Z dolphingarlic Price List (POI13_cen) C++14
100 / 100
257 ms 32316 KB
/*
POI 2013 Price
- Just do Dijkstra but search 2 edges deep
    - This is O(M^2) if we just do this naively though
    - Notice how if we encounter A->B->C in Dijkstra, then we never use X->B->C for
      a shorter route to C, since the cost is constant
        - This means we can just erase edge B->C after we use it 
    - We have to be careful to skip triangles though
        - Notice how there are O(M sqrt(M)) triangles, so we're fine just naively checking
- Complexity: O(N log N + M sqrt(M))
*/

#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

set<int> graph[100001], second_visit[100001];
int visited[100001];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m, k, a, b;
    cin >> n >> m >> k >> a >> b;
    FOR(i, 0, m) {
        int u, v;
        cin >> u >> v;
        graph[u].insert(v);
        graph[v].insert(u);
        second_visit[u].insert(v);
        second_visit[v].insert(u);
    }

    priority_queue<pair<int, int>> pq;
    pq.push({-1, k});
    while (pq.size()) {
        pair<int, int> curr = pq.top();
        pq.pop();
        if (!visited[curr.second]) {
            visited[curr.second] = -curr.first;
            for (int i : graph[curr.second]) {
                pq.push({curr.first - a, i});

                vector<int> to_remove;
                for (int j : second_visit[i]) {
                    if (graph[curr.second].find(j) == graph[curr.second].end()) {
                        to_remove.push_back(j);
                        pq.push({curr.first - b, j});
                    }
                }
                for (int j : to_remove) second_visit[i].erase(j);
            }
        }
    }

    FOR(i, 1, n + 1) cout << visited[i] - 1 << '\n';
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 10 ms 9728 KB Output is correct
2 Correct 10 ms 9728 KB Output is correct
3 Correct 10 ms 9856 KB Output is correct
4 Correct 10 ms 9728 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 9728 KB Output is correct
2 Correct 10 ms 9728 KB Output is correct
3 Correct 10 ms 9856 KB Output is correct
4 Correct 9 ms 9728 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 9856 KB Output is correct
2 Correct 10 ms 9856 KB Output is correct
3 Correct 10 ms 9856 KB Output is correct
4 Correct 13 ms 9856 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 12416 KB Output is correct
2 Correct 26 ms 12416 KB Output is correct
3 Correct 34 ms 13184 KB Output is correct
4 Correct 35 ms 13312 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 81 ms 18676 KB Output is correct
2 Correct 79 ms 18676 KB Output is correct
3 Correct 87 ms 18040 KB Output is correct
4 Correct 123 ms 21480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 128 ms 25236 KB Output is correct
2 Correct 106 ms 23284 KB Output is correct
3 Correct 227 ms 28416 KB Output is correct
4 Correct 209 ms 30072 KB Output is correct
5 Correct 157 ms 26212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 158 ms 28292 KB Output is correct
2 Correct 107 ms 23800 KB Output is correct
3 Correct 246 ms 30568 KB Output is correct
4 Correct 201 ms 30072 KB Output is correct
5 Correct 175 ms 28492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 189 ms 31340 KB Output is correct
2 Correct 148 ms 29176 KB Output is correct
3 Correct 257 ms 30584 KB Output is correct
4 Correct 204 ms 30072 KB Output is correct
5 Correct 197 ms 30404 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 160 ms 29940 KB Output is correct
2 Correct 156 ms 29936 KB Output is correct
3 Correct 252 ms 30712 KB Output is correct
4 Correct 209 ms 30072 KB Output is correct
5 Correct 218 ms 32316 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 163 ms 30864 KB Output is correct
2 Correct 161 ms 30584 KB Output is correct
3 Correct 252 ms 30740 KB Output is correct
4 Correct 200 ms 30328 KB Output is correct
5 Correct 210 ms 32308 KB Output is correct