[luogu P2330] [SCOI2005]繁忙的都市{最小生成树}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82690723

#题目
https://www.luogu.org/problemnew/show/P2330


#解题思路
题目给出的前两个条件就是裸的 K r u s k a l Kruskal ,对于最后的一个条件,我们只需要用一个 m a x n maxn 记录最后一个点的分值即可。


#代码

#include<cstdio>
#include<algorithm>
using namespace std; 
struct node{int x,y,w,next;}a[100001];
int len,last[10001],n,m,x,y,z,maxn,fa[10001];
int find(int x) {return fa[x]==x?fa[x]:fa[x]=find(fa[x]);}
void add(int x,int y,int z)
{
	a[++len]=(node){x,y,z,last[x]}; last[x]=len; 
	a[++len]=(node){y,x,z,last[y]}; last[y]=len; 
}
bool cmp(node x,node y){return x.w<y.w;}
int main()
{
	scanf("%d%d",&n,&m); printf("%d ",n-1); 
	for (int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z); 
    for (int i=1;i<=n;i++) fa[i]=i;
	sort(a+1,a+len+1,cmp); 
	for (int i=1;i<=len;i++)
	{
		int q=find(a[i].x),w=find(a[i].y); 
		if (q!=w){
			fa[q]=fa[w]; maxn=a[i].w; n--; 
		}
		if (n==1) break; 
	}
	printf("%d",maxn); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/82690723