Submission

Status:
[PPPP-SSSSS][-SSSSSSSSSSSSSSSSSSS]

Score: 0

User: fluke

Problemset: E.Kingdom

Language: cpp

Time: 0.122 second

Submitted On: 2025-03-01 12:44:20

#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);
    int n,m,k;
    int money = 0;
    cin>>n>>m>>k;
    vector <int> dis(n,-1);
    vector <pair<int,pii>> edge_list(m);
    vector <int> parent(n);
    for(int i=0 ;i<m;i++)cin>>edge_list[i].s.f>>edge_list[i].s.s>>edge_list[i].f;
    for(int i=1;i<n;i++)parent[i]=i;
    sort(all(edge_list),greater <pair<int,pii>>());

    for(int i=0 ; i<m;i++){
        int a = edge_list[i].s.f;
        int b = edge_list[i].s.s;
        int value = edge_list[i].f;

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

        if(A != B){
            parent[A] = B;
            dis[a] = max(dis[a] , value);
            dis[b] = max(dis[b] , value);
        }
        else if(value < k)money++;// ทุบ 1 บาท

        //cout<<money<<"\n";
        //for(auto x : dis)cout<<x<<" ";
        //DB 
        
    }

    for(int i=0;i<n-1;i++){
        int A = find_root(i,parent);
        int B = find_root(i+1 , parent);

        if(A != B){// สร้าง k บาท
            parent[A] = B;
            dis[i] = max(dis[i] , k);
            dis[i+1] = max(dis[i+1] , k);
            money += k;
        }
        
    }

    for(int i=0;i<n;i++){// เปรี่ยน ราคา
        if(dis[i] < k)money += k-dis[i];
    }

    cout<<money;

}