【原創】最小生成樹 並查集

不說了

#include<bits/stdc++.h>
using namespace std;
struct edge{
	int from;
	int to;
	int cost;
}G[200005];
int n,m,cnt=0,ans=0,ct=0;
int p[5005];
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
bool cmp(edge A,edge B){
	return A.cost<B.cost;
}
void Init(){
	for(int i=1;i<=5000;i++)
		p[i]=i;
}
int main(){
	Init();
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		G[++cnt].from=x;
		G[cnt].to=y;
		G[cnt].cost=z;
	}
	sort(G+1,G+cnt+1,cmp);
	for(int i=1;i<=m;i++){
			int a=G[i].from,b=G[i].to;
			int r1=find(a),r2=find(b);
			if(r1==r2)continue;
			if(r1!=r2){
				ans+=G[i].cost;
				p[r1]=r2;
				ct++;
			}
			if(ct==n-1)break;
	}
	printf("%d",ans);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章