Submission
Status:
[PPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: s0m30n3
Problemset: รัฐบาล
Language: cpp
Time: 0.005 second
Submitted On: 2026-02-03 19:26:09
#include<iostream>
#include<algorithm>
#include<climits>
#include<vector>
using namespace std;
vector<int> parent;
struct Edge{
int u,v,w;
};
int find(int x){
if(parent[x] == 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;
parent[b] = a;
return true;
}
int main(){
int n,m;
cin >> n >> m;
parent.resize(n+5, -1);
vector<Edge> edges(m);
for(int i=0;i<m;i++){
cin >> edges[i].u >> edges[i].v >> edges[i].w;
}
sort(edges.begin(), edges.end(), [](Edge &a, Edge &b){
return a.w < b.w;
});
for(int i=1;i<=n;i++) parent[i]=i;
int mst_cost=0;
vector<int> used = {};
for(int i=0;i<m;i++){
if(unite(edges[i].u, edges[i].v)){
mst_cost+=edges[i].w;
used.push_back(i);
}
}
int second_mst = INT_MAX;
for(int skip : used){
for(int i=1;i<=n;i++) parent[i] = i;
int cost=0;
int cnt=0;
for(int i=0;i<m;i++){
if(i == skip) continue;
if(unite(edges[i].u , edges[i].v)){
cost+=edges[i].w;
cnt++;
}
}
if(cnt == n-1){
second_mst = min(second_mst,cost);
}
}
cout << mst_cost << " " << second_mst;
}