Submission
Status:
[PPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: dddrrrr
Problemset: รัฐบาล
Language: cpp
Time: 0.008 second
Submitted On: 2026-03-12 22:12:38
#include <bits/stdc++.h>
#define int long long
const int MOD = 1e7 + 9;
using namespace std;
int n ,m;
struct DSU{
vector <int> parent ,sz;
DSU(int n){
parent.resize(n);
sz.resize(n ,0);
for(int i=0 ;i<n ;i++)parent[i] = i;
}
int find(int x){
if(x == parent[x])return x;
return parent[x] = find(parent[x]);
}
bool unite(int a ,int b){
a = find(a);
b = find(b);
if(a == b)return false;
if(sz[a] < sz[b])swap(a ,b);
sz[a] += sz[b];
parent[b] = a;
return true;
}
};
vector <vector <int>> inmst;
int mst(vector <vector <int>> &edges){
DSU dsu(n+1);
int sum = 0 ,cnt = 0;
for(int i=0 ;i<m ;i++){
int w=edges[i][0] ,a=edges[i][1] ,b=edges[i][2];
if(dsu.unite(a ,b)){
cnt ++;
inmst.push_back(edges[i]);
sum += w;
}
}
if(cnt != n-1)return LLONG_MAX;
return sum;
}
int32_t main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> n >> m;
vector <vector <int>> edges;
for(int i=0 ;i<m ;i++){
int u ,v ,w;
cin >> u >> v >> w;
edges.push_back({w ,u ,v});
}
sort(edges.begin() ,edges.end());
int one = mst(edges);
sort(inmst.begin() ,inmst.end());
int second = LLONG_MAX;
for(int i=0 ;i<inmst.size() ;i++){
int sum = 0 ,cnt = 0;
DSU dsu(n+1);
for(int j=0 ;j<m ;j++){
if(edges[j] == inmst[i])continue;
int w=edges[j][0] ,a=edges[j][1] ,b=edges[j][2];
if(dsu.unite(a ,b)){
sum += w;
cnt++;
}
}
if(cnt != n-1)continue;
second = min(second ,sum);
}
cout << one << ' '<< second;
return 0;
}