kruskal(最小生成树)

思想
将图中的边按照权值的大小排序,存在数组里。依次取出后,用并查集将边的另一个点打上标记。到所有点都打上标记后,结束。

#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
int tot=0;
int vis[maxn],fa[maxn];
struct node{
	int u,v,w;
};
node edge[maxn];
bool cmp(node x,node y){
    return x.w<y.w;
}
int find(int x){
	if(fa[x]==x) return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
void merge(int x,int y){
	int a=find(x),b=find(y);
	fa[b]=a;
}
int main(){
	freopen("temp.in","r",stdin);
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y,z;
		scanf("%d %d %d",&x,&y,&z);
		edge[++tot].u=x;edge[tot].v=y;edge[tot].w=z;
		edge[++tot].u=y;edge[tot].v=x;edge[tot].w=z;
	}
	for(int i=1;i<=n;i++)fa[i]=i;
	sort(edge,edge+tot+1,cmp);
	int k=1,ans=0;
	for(int i=1;i<n;i++){
		while(find(edge[k].u)==find(edge[k].v))k++;
		ans+=edge[k].w;
		merge(edge[k].u,edge[k].v);
	}
	printf("%d\n",&ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43342048/article/details/82958844