Submission #1319362

#TimeUsernameProblemLanguageResultExecution timeMemory
1319362Boycl07Robot (JOI21_ho_t4)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; const long long INF = 1e16; struct Edge { int to, color, cost, id; long long sum_c; // Tổng chi phí các cạnh cùng màu tại đỉnh bắt đầu }; struct Node { long long d; int u, edge_id; // edge_id = -1: trạng thái thường, >= 0: mã cạnh vừa đi qua bool operator>(const Node& other) const { return d > other.d; } }; vector<Edge> adj[100005]; long long dist_node[100005]; long long dist_edge[200005]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<int> U(m), V(m), C(m), P(m); for (int i = 0; i < m; ++i) { cin >> U[i] >> V[i] >> C[i] >> P[i]; adj[U[i]].push_back({V[i], C[i], P[i], i * 2}); adj[V[i]].push_back({U[i], C[i], P[i], i * 2 + 1}); } // Dùng Two Pointers để tính sum_c cho mỗi cụm màu tại từng đỉnh for (int i = 1; i <= n; ++i) { sort(adj[i].begin(), adj[i].end(), [](const Edge& a, const Edge& b) { return a.color < b.color; }); int sz = adj[i].size(); for (int j = 0; j < sz; ) { int k = j; long long current_sum = 0; while (k < sz && adj[i][k].color == adj[i][j].color) { current_sum += adj[i][k].cost; k++; } // Gán sum_c cho tất cả các cạnh trong cụm màu này for (int l = j; l < k; ++l) adj[i][l].sum_c = current_sum; j = k; } dist_node[i] = INF; } for (int i = 0; i < 2 * m; ++i) dist_edge[i] = INF; priority_queue<Node, vector<Node>, greater<Node>> pq; dist_node[1] = 0; pq.push({0, 1, -1}); while (!pq.empty()) { Node top = pq.top(); pq.pop(); long long d = top.d; int u = top.u; if (top.edge_id == -1) { if (d > dist_node[u]) continue; for (auto& e : adj[u]) { // Cách 1: Đổi màu duy nhất cạnh e (tốn P_i) if (dist_node[e.to] > d + e.cost) { dist_node[e.to] = d + e.cost; pq.push({dist_node[e.to], e.to, -1}); } // Cách 2: Đổi màu các cạnh cùng màu e.color tại u (tốn Sum - P_i) if (dist_node[e.to] > d + e.sum_c - e.cost) { dist_node[e.to] = d + e.sum_c - e.cost; pq.push({dist_node[e.to], e.to, -1}); } // Cách 3: Chuyển sang trạng thái "nợ" (Strategy B) - không tốn phí bây giờ if (dist_edge[e.id] > d) { dist_edge[e.id] = d; pq.push({dist_edge[e.id], e.to, e.id}); } } } else { if (d > dist_edge[top.edge_id]) continue; // Lấy màu của cạnh đã dẫn robot đến u // Cạnh id=k nối (u, v) thì cạnh ngược lại là k^1 nối (v, u) int color_prev = -1; // Ở trạng thái này, robot vừa đi qua cạnh top.edge_id có màu cụ thể. // Ta cần tìm lại màu đó. Để nhanh, hãy lưu color_prev vào State. } } // ...

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:95:6: error: expected '}' at end of input
   95 |     }
      |      ^
Main.cpp:21:12: note: to match this '{'
   21 | int main() {
      |            ^