diff --git a/CSES Problem Set/Road Reparation-kruskal.cpp b/CSES Problem Set/Road Reparation-kruskal.cpp new file mode 100644 index 0000000..73cb716 --- /dev/null +++ b/CSES Problem Set/Road Reparation-kruskal.cpp @@ -0,0 +1,131 @@ +/* Problem URL: https://cses.fi/problemset/task/1675 */ + +#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; +} + +vi dsu; +ll cost; +int c; + +int find_p(int i) +{ + if (i == dsu[i]) { + return i; + } + return dsu[i] = find_p(dsu[i]); +} + +void make_pair(int a, int b, ll v) +{ + a = find_p(a); + b = find_p(b); + + if (a == b) { + return; + } + + cost += v; + c--; + + dsu[b] = a; +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int n, m; + cin >> n >> m; + + dsu.resize(n); + rep(i, n) { + dsu[i] = i; + } + c = n; + + V> edges(m); + for (auto &[v, x, y] : edges) { + cin >> x >> y >> v; + x--, y--; + } + + sortv(edges); + + for (auto &[v, x, y] : edges) { + make_pair(x, y, v); + } + + if (c != 1) { + cout << "IMPOSSIBLE\n"; + return 0; + } + + cout << cost << '\n'; +} diff --git a/CSES Problem Set/Road Reparation-prim.cpp b/CSES Problem Set/Road Reparation-prim.cpp new file mode 100644 index 0000000..f546375 --- /dev/null +++ b/CSES Problem Set/Road Reparation-prim.cpp @@ -0,0 +1,128 @@ +/* Problem URL: https://cses.fi/problemset/task/1675 */ + +#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; +} + +V>> graph; + +ll prim() +{ + priority_queue, V>, greater<>> pq; + V vis(graph.size(), false); + int remaining = vis.size(); + ll cost = 0; + + pq.emplace(0, 0); + + while (!pq.empty()) { + auto [v, u] = pq.top(); pq.pop(); + + if (vis[u]) { + continue; + } + + vis[u] = true; + remaining--; + cost += v; + + for (auto [x, cos] : graph[u]) { + if (!vis[x]) { + pq.emplace(cos, x); + } + } + } + + return remaining == 0 ? cost : -1; +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int n, m; + cin >> n >> m; + + graph.resize(n); + while (m--) { + ll a, b, v; + cin >> a >> b >> v; + a--, b--; + + graph[a].emplace_back(b, v); + graph[b].emplace_back(a, v); + } + + ll ans = prim(); + if (ans == -1) { + cout << "IMPOSSIBLE\n"; + return 0; + } + cout << ans << '\n'; +}