- 题解
步道维护
- @ 2026-8-3 11:58:05
#include<bits/stdc++.h>
using namespace std;
const int N=210;
struct node {
int l,r,w;
} a[N*N];
int n,m,p[N],cnt;
int find(int x) {
if(p[x]!=x) return p[x]=find(p[x]);
return p[x];
}
bool cmp(node a,node b) {
return a.w<b.w;
}
int kruskal() {
for(int i=1; i<=n; i++) p[i]=i;
int ans=0,num=0;
for(int i=1; i<=cnt; i++) {
int pa=find(a[i].l),pb=find(a[i].r);
if(pa!=pb) {
p[pa]=pb;
ans+=a[i].w;
num++;
} else {
swap(a[i],a[cnt]);
cnt--;
i--;
}
}
if(num==n-1) return ans;
return -1;
}
int main() {
int t;
cin>>t;
for(int i=1; i<=t; i++) {
printf("Case %d:\n",i);
cin>>n>>m;
cnt=0;
for(int i=1; i<=m; i++) {
int l,r,w;
cin>>l>>r>>w;
cnt++;
a[cnt]= {l,r,w};
sort(a+1,a+cnt+1,cmp);
cout<<kruskal()<<endl;
}
}
return 0;
}
0 条评论
目前还没有评论...