Submission
Status:
[PPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: Gump2011
Problemset: รัฐบาล
Language: cpp
Time: 0.004 second
Submitted On: 2026-03-08 17:31:00
#include <bits/stdc++.h>
using namespace std;
int parent[105];
// Union-Find
int find(int x){
return parent[x] == x ? x : parent[x] = find(parent[x]);
}
// Compare function สำหรับ sort
bool cmp(const array<int,3> &a, const array<int,3> &b){
return a[2] < b[2]; // sort ตาม weight
}
// Kruskal
int kruskal(int n, vector<array<int,3>> &edges, vector<int> &mst_edges){
for(int i=1;i<=n;i++) parent[i] = i;
sort(edges.begin(), edges.end(), cmp); // ใช้ compare function ธรรมดา
int cost = 0;
mst_edges.clear();
for(int i=0;i<edges.size();i++){
int u = edges[i][0], v = edges[i][1], w = edges[i][2];
int pu = find(u), pv = find(v);
if(pu != pv){
parent[pu] = pv;
cost += w;
mst_edges.push_back(i);
}
}
if(mst_edges.size() != n-1) return INT_MAX;
return cost;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin >> n >> m;
vector<array<int,3>> edges(m);
for(int i=0;i<m;i++){
cin >> edges[i][0] >> edges[i][1] >> edges[i][2];
}
vector<int> mst_edges;
int D1 = kruskal(n, edges, mst_edges);
int D2 = INT_MAX;
for(int i=0;i<mst_edges.size();i++){
for(int j=1;j<=n;j++) parent[j] = j;
int cost = 0, count = 0;
for(int k=0;k<edges.size();k++){
if(k == mst_edges[i]) continue;
int u = edges[k][0], v = edges[k][1], w = edges[k][2];
int pu = find(u), pv = find(v);
if(pu != pv){
parent[pu] = pv;
cost += w;
count++;
}
}
if(count == n-1) D2 = min(D2, cost);
}
cout << D1 << " " << D2 << "\n";
return 0;
}