From 004098143287aa1b18800ca937525af24c31a4cf Mon Sep 17 00:00:00 2001 From: Segcolt <9hmbzr275@mozmail.com> Date: Tue, 24 Sep 2024 09:41:49 -0300 Subject: [PATCH] First problem uploaded here. I am stupid, I made a struct that ordenates everything into a different way, but then I forgot to change the variables on the dijkstra loop to the correct order and ended up screwing everything... At least I'm sure I won't be doing this mistake again in the future. --- .gitignore | 2 + CSES Problem Set/Flight Discount.cpp | 142 +++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 CSES Problem Set/Flight Discount.cpp diff --git a/.gitignore b/.gitignore index e257658..98e855c 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ *.out *.app +# Ignore testcases files from competitest +*.testcases diff --git a/CSES Problem Set/Flight Discount.cpp b/CSES Problem Set/Flight Discount.cpp new file mode 100644 index 0000000..95e2edb --- /dev/null +++ b/CSES Problem Set/Flight Discount.cpp @@ -0,0 +1,142 @@ +/* Problem URL: https://cses.fi/problemset/task/1195 */ + +#include + +using namespace std; + +#define V vector + +#define rmin(a, b) a = min(a, b) +#define rmax(a, b) a = max(a, b) + +#define rep(i, lim) for (size_t i = 0; i < (lim); i++) +#define nrep(i, s, lim) for (size_t i = s; i < (lim); i++) + +#define repv(i, v) for (auto &i : (v)) +#define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } +#define sortv(v) sort(v.begin(), v.end()) +#define all(v) (v).begin(), (v).end() + +using vi = vector; +using vvi = vector; +using vvvi = vector; +using vvvvi = vector; + +using ll = long long; + +using vl = vector; +using vvl = vector; +using vvvl = vector; +using vvvvl = vector; + +template +auto operator<<(ostream &os, const vector &vec)->ostream& { + os << vec[0]; + for (size_t i = 1; i < vec.size(); i++) { + os << ' ' << vec[i]; + } + os << '\n'; + return os; +} + +template +auto operator>>(istream &is, vector &vec)->istream& { + for (auto &i : vec) { + is >> i; + } + return is; +} + +template +auto operator<<(ostream &os, const vector> &vec)->ostream& { + for (auto &i : vec) { + os << i[0]; + for (size_t j = 1; j < i.size(); j++) { + os << ' ' << i[j]; + } + os << '\n'; + } + return os; +} + +template +auto operator>>(istream &is, vector> &vec)->istream& { + for (auto &i : vec) { + for (auto &j : i) { + is >> j; + } + } + return is; +} + +struct node { +public: + int no; + ll cost; + int used; + + node(int no, long long cost, int used) : no(no), cost(cost), used(used) {} + + auto operator<(node &n) const->bool { + return cost < n.cost; + } + + auto operator>(node &n) const->bool { + return cost > n.cost; + } +}; + +vvl dist; +V>> graph; + +long long dijkstra(int n) +{ + priority_queue, greater<>> pq; + pq.emplace(0, 0, 0); + dist[0][0] = 0; + dist[0][1] = 0; + + while (!pq.empty()) { + auto [v, u, b] = pq.top(); pq.pop(); + + if (dist[v][b] < u) { + continue; + } + + for (auto [n, c] : graph[v]) { + if (u + c < dist[n][b]) { + dist[n][b] = u + c; + pq.emplace(n, dist[n][b], b); + } + if (b == 0 && u + (c / 2) < dist[n][1]) { + dist[n][1] = u + (c / 2); + pq.emplace(n, dist[n][1], 1) ; + } + } + } + + return min(dist[n - 1][0], dist[n - 1][1]); +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int n, m; + cin >> n >> m; + + dist.assign(n, vl(2, INT64_MAX)); + graph.resize(n); + + while (m--) { + long long a, b, c; + cin >> a >> b >> c; + a--, b--; + graph[a].emplace_back(b, c); + } + + cout << dijkstra(n) << '\n'; + + return 0; +}