25pts,WA,离线做法
查看原帖
25pts,WA,离线做法
752094
MornHus楼主2023/1/13 15:32
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	char c=getchar();
	while(c>'9'||c<'0'){
		c=getchar();
	}
	while(c<='9'&&c>='0'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x;
}
int n,w;
int f[201];
int find(int x){
	if(f[x]!=x)f[x]=find(f[x]);
	return f[x];
}
inline void unity(int x,int y){
	x=find(x);
	y=find(y);
	if(x==y)return ;
	f[x]=y;
}
struct lines{
	int u,v,id;
	long long val;
	bool operator < (const lines &a)const{
		return val<a.val;
	}
}l[6001];
inline void kruskal(int times){
	long long ans=0;int cnt=0;
	for(int i=1;i<=w;i++)f[i]=i;
	for(int i=1;i<=w;i++){
		if((l[i].id>times)||(find(l[i].u)==find(l[i].v)))continue;
		unity(l[i].u,l[i].v);
		ans+=l[i].val;
		cnt++;
		if(cnt==n-1){
			printf("%lld\n",ans);
			return;
		}
	}
	printf("-1\n");
}
int main(){
	n=read();
	w=read();
	for(int i=1;i<=w;i++){
		l[i].u=read();
		l[i].v=read();
		l[i].id=i;
		l[i].val=read();
	}
	sort(l+1,l+w+1);
	for(int i=1;i<=w;i++){
		kruskal(i);
	}
	return 0;
}
2023/1/13 15:32
加载中...