求助克鲁斯卡尔
查看原帖
求助克鲁斯卡尔
418419
ko_no_lzx_da楼主2022/4/3 17:02
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int head[1000000];
struct node{
	int from,to,v,next;
}edge[1000000];
int n,m;
int fa[1000000];
int cnt;
bool cmp(node x,node y){
	return x.v<y.v;
}
void add(int from,int to,int v){
	edge[++cnt].from=from;
	edge[cnt].to=to;
	edge[cnt].v=v;
	edge[cnt].next=head[from];
	head[from]=cnt;
}
int find(int x){
	if(fa[x]==x){
		return x;
	}else{
		fa[x]=find(fa[x]);
	}
} 
void hb(int x,int y){
	int fx=fa[x],fy=fa[y];
	fa[fx]=find(fa[fy]);
}
int main(){
	cin >>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin >>u>>v>>w;
		add(u,v,w);
	}
	sort(edge+1,edge+1+m,cmp);
	int num=0,sum=0;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=cnt;i++){
		int x=edge[i].from,y=edge[i].to;
		if(fa[x]!=fa[y]){
			num++;
			hb(fa[x],fa[y]);
			sum=max(sum,edge[i].v);
		}
		if(num==n-1){
			cout <<num<<" "<<sum;
			return 0;
		}
	}
	return 0;
}



2022/4/3 17:02
加载中...