14 条题解

  • -2
    @ 2022-3-16 16:25:22

    使用 Kruskal 算法。

    有环的情况可以用并查集跳过。

    #include<bits/stdc++.h>
    using namespace std;
    long long n,m,fa[100005],cnt,ans,s[100005];
    struct node{
    	long long u,v,w;
    }a[200005];
    bool cmp(node x,node y){
    	return x.w<y.w;
    }
    int find(int x){
    	if(fa[x]==x)
    		return x;
    	return fa[x]=find(fa[x]);
    }
    void merge(int x,int y){
    	if(s[x]<s[y])
    		swap(x,y);
    	int fx=find(x),fy=find(y);
    	fa[fy]=fx,s[fx]+=s[fy];
    }
    int main(){
    	scanf("%lld%lld",&n,&m);
    	for(int i=1;i<=m;i++)
    		scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].w);
    	sort(a+1,a+m+1,cmp);
    	for(int i=1;i<=n;i++)
    		fa[i]=i;
    	for(int i=1;i<=m;i++){
    		if(find(a[i].u)==find(a[i].v))
    			continue;
    		merge(a[i].u,a[i].v);
    		cnt++;
    		ans+=a[i].w;
    		if(cnt==n-1)
    			break;
    	}
    	printf("%lld",ans);
    	return 0;
    }
    

    信息

    ID
    91
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    871
    已通过
    286
    上传者