Luogu P1550 [USACO08OCT]打井Watering Hole

0号结点:农夫John山泉天然矿泉水(

by Luogu第一篇题解

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,cnt,tot,ans,fa[100005];

struct edge{
	int u,v,w;
}e[100005];

inline void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].u=u;
	e[cnt].w=w;
}

inline int getfa(int v){
	if(fa[v]==v)return v;
	fa[v]=getfa(fa[v]);
	return fa[v];
}

inline bool cmp(edge x,edge y){
	return x.w<y.w;
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		fa[i]=i;
		int x;scanf("%d",&x);
		add(0,i,x);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int x;scanf("%d",&x);
			add(i,j,x);
		}
	}
	sort(e+1,e+cnt+1,cmp);
	for(int i=1;i<=cnt;i++){
		int fx=getfa(e[i].u),fy=getfa(e[i].v);
		if(fx!=fy){
			fa[fx]=fy;
			tot++;
			ans+=e[i].w;
		}
		if(tot==n){
			printf("%d
",ans);
			return 0;
		}
	}
}
原文地址:https://www.cnblogs.com/Y15BeTa/p/11324972.html