kruskal 0pts代码求调
查看原帖
kruskal 0pts代码求调
947153
ZHR100102楼主2024/4/1 23:45
#include <bits/stdc++.h>
using namespace std;
int n,m,h[100005],f[100005],num[100005];
struct edge{
	int u,v,w;
}e[1000005];
bool cmp(edge a,edge b)
{
	if(h[a.v]!=h[b.v])return h[a.v]>h[b.v];
	return a.w<b.w;
}
void init()
{
	for(int i=1;i<=100000;i++)
	{
		f[i]=i;
		num[i]=1;
	}
}
int findf(int x)
{
	if(f[x]!=x)f[x]=findf(f[x]);
	return f[x];
}
void combine(int x,int y)
{
	int fa=findf(x),fb=findf(y);
	f[fa]=fb;
	num[fb]+=num[fa];
}
int main()
{
	cin>>n>>m;
	init();
	int a,b,c;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b>>c;
		e[i]={a,b,c};
	}
	sort(e+1,e+m+1,cmp);
	long long res=0;
	for(int i=1;i<=m;i++)
	{
		a=e[i].u,b=e[i].v,c=e[i].w;
		if(findf(a)!=findf(b))
		{
			res+=c;
			combine(a,b);
		}
	}
	int dot=-1;
	
	for(int i=1;i<=n;i++)
	{
		int anc=findf(i);
		dot=max(dot,num[anc]);
	}
	cout<<dot<<' '<<res;
	return 0;
}
2024/4/1 23:45
加载中...