Submission

Status:
[PPPPPP-SSS][PPPPPPPPPP-SSSSSSSSS]

Score: 0

User: fluke

Problemset: E.Kingdom

Language: cpp

Time: 0.187 second

Submitted On: 2025-03-01 14:44:33

#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;
    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++;
            }
        }
        else { // A != B
            if(value >= k){
                parent[A] = B;
                more_k = min(more_k , value - k);
            }
            else {
                parent[A] = B;
                cost += k-value;
                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;
        }
    }

    if(less_k == 0 || more_k == 0){
        cout<<cost + road_break;
    }
    else if(less_k <= more_k){
        cout<<cost + less_k + road_break -1 ;
    }
    else {
        cout<<cost + more_k + road_break;
    }




}