Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*author* Priyanshu Shrivastav (from IIT Palakkad) *
- * *_ __ ___ _ ______ ___ _ ____ ___ ___| |_ *
- * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
- * | | | | | | | | (_| (_) | | | \ V /| | (__| |_ *
- * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
- When I wrote this, only God and I understood what I was doing
- ** * * * * * * * Now, only God knows * * * * * * */
- #include <bits/stdc++.h>
- #pragma GCC optimize ("Ofast")
- #pragma GCC optimize ("unroll-loops")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #define IOS ios_base::sync_with_stdio(false); cin.tie (nullptr)
- #define PREC cout.precision (10); cout << fixed
- #define bg(x) "[ " << #x << " : " << x << " ]"
- #define x first
- #define y second
- using namespace std;
- using pii = pair <int, int>;
- const int N = (int)1e4 + 10;
- int n, m, A;
- struct Edge {
- int u, v;
- int w;
- inline bool operator < (const Edge &o) const {
- return w < o.w;
- }
- };
- vector <Edge> edges;
- int rep[N], rnk[N];
- void makeSet() {
- for(int i = 0; i < n; ++i)
- rep[i] = i, rnk[i] = 0;
- }
- int findSet(int u) {
- int ru = u;
- while (ru != rep[ru])
- ru = rep[ru];
- while (u != rep[u]) {
- int tmp = rep[u];
- rep[u] = ru;
- u = tmp;
- }
- return ru;
- }
- void mergeSet(int u, int v) {
- int ru = findSet(u), rv = findSet(v);
- if (rnk[ru] > rnk[rv]) rep[rv] = rep[ru];
- else rep[ru] = rep[rv];
- if (rnk[ru] == rnk[rv])
- ++rnk[rv];
- }
- pii kruskals () {
- int cost = 0;
- sort (edges.begin(), edges.end());
- makeSet();
- int cnt = n;
- for (Edge e : edges) {
- int u = e.u, v = e.v;
- int w = e.w;
- if (findSet(u) == findSet(v) || w >= A) continue;
- cost += w;
- mergeSet(u, v);
- --cnt;
- }
- //assert (cnt == n - 1);
- return {cost, cnt};
- }
- void solve(int tc) {
- cout << "Case #" << tc << ": ";
- pii ans = kruskals();
- cout << 1ll * ans.x + 1ll * ans.y * A << ' ' << ans.y << '\n';
- }
- void read() {
- cin >> n >> m >> A;
- edges.clear();
- int u, v, w;
- for (int i = 0; i < m; ++i) {
- cin >> u >> v >> w;
- --u, --v;
- edges.push_back({u, v, w});
- }
- }
- signed main() {
- int tc;
- cin >> tc;
- for (int i = 1; i <= tc; ++i) {
- read();
- solve(i);
- }
- return EXIT_SUCCESS;
- }
Add Comment
Please, Sign In to add comment