Submission

Status:
[PPPPPPPPPP][PPPPPPPPPPPPPPPPPPPP]

Score: 100

User: fluke

Problemset: E.Kingdom

Language: cpp

Time: 0.246 second

Submitted On: 2025-03-01 15:40:43

#include <bits/stdc++.h>
#define ll long long 
#define f first 
#define s second
#define pii pair<int,int> 
#define emb emplace_back
#define em emplace
#define all(x) x.begin(),x.end()
#define pb push_back
#define DB cout<<"\n";system("pause");
using namespace std;

int find_root(int node , vector <int> &parent){
    if(parent[node] == node)return node;
    return parent[node] = find_root(parent[node] , parent);
}

int main(){
//ios::sync_with_stdio(false);cin.tie(0);
    ll n,m,k,use_edge=0;
    ll cost = 0;

    cin>>n>>m>>k;
    vector <int> parent(n);
    vector <pair<ll,pii> > edge_list(m);

    for(int i=1 ; i<n ;i++)parent[i] = i;
    for(int i=0;i<m;i++){
        cin>>edge_list[i].s.f>>edge_list[i].s.s>>edge_list[i].f;
    }
    sort(all(edge_list) , greater <pair<ll,pii>>());
    
    int road_break = 0;
    ll more_k = 1e18;
    ll less_k = 1e18;
    
    for(auto x : edge_list){
        ll value = x.f;
        int a = x.s.f;
        int b = x.s.s;

        int A = find_root(a,parent);
        int B = find_root(b,parent);

        if(A == B){
            if(value >= k){
                more_k = min(more_k , value - k);
            }
            else {
                less_k = min(less_k , k - value);
                road_break++; // break
            }
        }
        else { // A != B
            use_edge ++ ;
            if(value >= k){
                parent[A] = B;
                more_k = min(more_k , value - k);
            }
            else {
                parent[A] = B;
                cost += k-value; // change cost 
                less_k = 0;
            }
        }
    }

    /*for(int i=0 ; i<n-1;i++){
        int A = find_root(i,parent);
        int B = find_root(i+1,parent);
        
        if(A!=B){
            parent[A] = B;
            cost += k;
            less_k = 0;
        }
    }*/

    //cout<<use_edge;
    if(use_edge != n-1){
        cost += (n-1-use_edge)*k; // build new road
        less_k = 0;
    }
    
    if(less_k == 0 || more_k == 0){
        cout<<cost + road_break;
    }
    else if(less_k <= more_k){
        cout<<cost + road_break + min(-1 + less_k ,k);
    }
    else {
        cout<<cost + min(more_k , k) + road_break;
    }




}