最小生成树20pts
查看原帖
最小生成树20pts
289296
zymooll楼主2021/11/16 20:46
#include<bits/stdc++.h>
using namespace std;
struct Edge{
	int u,v,w;
	bool operator <(const Edge& x1){
		return w<x1.w;
	}
}edge[100010];
int n,p,js,ans,minn=INT_MAX;
int sj[10010];
int fa[10010];
int find(int a){
	if(fa[a]!=a)fa[a]=find(fa[a]);
	return fa[a];
}
bool check(int a,int b){
	return fa[a]==fa[b];
}
void merge(int a,int b){
	fa[find(a)]=find(b);
}
int main(){
	cin>>n>>p;
	for(int i=1;i<=n;i++){
		fa[i]=i;
		cin>>sj[i];
		minn=min(sj[i],minn);
	}
	for(int i=1;i<=p;i++){
		int u,v,w;
		cin>>u>>v>>w;
		edge[i]=(Edge){u,v,sj[u]+sj[v]+2*w};
	}
	sort(edge+1,edge+1+p);
	for(int i=1;js!=n-1;i++){
		int u=edge[i].u,v=edge[i].v,w=edge[i].w;
		if(check(u,v)){
			continue;
		}
		merge(u,v);
		js++;
		ans+=w;
	}
	cout<<ans+minn;
	return 0;
}
2021/11/16 20:46
加载中...