14 条题解

  • 1
    @ 2024-6-1 18:33:12

    在这里,我使用了 Kruskal 算法解决这道题(想看Prim算法的移步别的题解)。

    思路:把边从边权大小从小到大排序,从 00 号开始遍历整个图,创建最小生成树,累加权值。使用一个优化后的并查集,如果所有边都在一个集中,则结束。输出权值总和。如果枚举完所有的点后仍达不到 n1n-1 条,则不行。

    最后,我想提醒大家:

    不开longlong,见!祖!宗!

    代码(禁止抄袭!):

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,sum,cnt,f[200001];
    struct node{
    	int u,v,w;
    }a[200001];
    bool cmp(node x,node y){
    	return x.w<y.w;
    }
    int find(int x){
    	if(f[x]==x){
    		return x;
    	}
    	return f[x]=find(f[x]);
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++){
    		f[i]=i;
    	}
    	for(int i=1;i<=m;i++){
    		scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
    	}
    	sort(a+1,a+m+1,cmp);
    	for(int i=1;i<=m;i++){
    		if(find(a[i].u)!=find(a[i].v)){
    			cnt++;
    			sum+=a[i].w;
    			f[find(a[i].u)]=find(a[i].v);
    		}
    	}
    	if(cnt!=n-1){
    		printf("orz");
    		return 0;
    	}
    	printf("%d",sum);
    	return 0;
    }
    

    信息

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