C++ P3366 【模板】最小生成树

版权声明:转载请保留原地址 https://blog.csdn.net/u012972031/article/details/82832317

不谈

直接上代码。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Edge{
	int u,v;
	int w;
};
Edge edgeArray[200000+5];
int pointFatherArray[5000+5];

int compareTo(Edge a,Edge b){
	return a.w<b.w;
}
int find(int x){
	return x==pointFatherArray[x]?x:pointFatherArray[x]=find(pointFatherArray[x]);
}
int kruskal(int pointAmount,int edgeAmount){
	int totalWeight=0;
	int totalEdgeAmount=0;//最小生成树的边数 
	for(int i=0;i<edgeAmount;i++){
		Edge edge=edgeArray[i];
		int uPointFather=find(edge.u);
		int vPointFather=find(edge.v);
		if(uPointFather==vPointFather)continue; 
		totalWeight+=edge.w;//注意 不要忘记加总权重啊 
		pointFatherArray[uPointFather]=vPointFather;
		totalEdgeAmount++;
		if(totalEdgeAmount==pointAmount-1){
			return totalWeight;
		}
	}
	return totalWeight;
}
int main(){
	int pointAmount,edgeAmount;
	scanf("%d%d",&pointAmount,&edgeAmount);
	for(int i=0;i<edgeAmount;i++){
		//Edge edge=edgeArray[i];
		//cin>>edge.u>>edge.v>>edge.w; 注意  不要这样写!! 
		cin>>edgeArray[i].u>>edgeArray[i].v>>edgeArray[i].w;
	}
	for(int i=1;i<=pointAmount;i++){//不要忘记预处理pointFatherArray
		pointFatherArray[i]=i;
	}
	sort(edgeArray,edgeArray+edgeAmount,compareTo);
	int totalWeight=kruskal(pointAmount,edgeAmount);
	cout<<totalWeight<<endl;
	return 0;
}

怎么学呢?首先,看紫书,大概看懂之后,你可能是懵逼的。(像我一样)
接下来我们看一下代码。
…代码大概挺好懂的QAQ我就不解释了(其实是不知道咋解释)

由于这道题的特殊性(只需要求出总权值即可),所以我们直接扔了并查集压缩路径(就是让子结点的父结点直接设置为最大的父结点,这样访问子结点的最大的父结点就快了),也就是说我们结束之后没法输出最小生成树的样子。
某蒟蒻:那么我该怎么输出最小生成树的样子呢QAQ
zyc大佬:记录每一次留下的边

猜你喜欢

转载自blog.csdn.net/u012972031/article/details/82832317