1 条题解

  • 0
    @ 2025-10-8 16:48:57
    #include<bits/stdc++.h>
    using namespace std;
    struct edge{int x,y,c;}a[60000];int alen;
    bool cmp(edge n1,edge n2){return n1.c<n2.c;}
    
    int fa[310];
    int findfa(int x){ return fa[x]= (fa[x]==x)? fa[x] : findfa(fa[x]);  }
    
    int b[302][302]; 
    
    int main()
    {
    	int n;scanf("%d",&n);
    	for(int i=1;i<=n;i++)//地球为第n+1个点
    	{
    		int x; scanf("%d",&x);
    		b[i][n+1]=b[n+1][i]=x;
    	}
    	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) scanf("%d",&b[i][j]);
    	n++;
    	
    	alen=0;
    	for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)a[++alen]=edge{i,j,b[i][j]};
    	
        sort(a+1,a+alen+1,cmp);
        
        for(int i=1;i<=n;i++) fa[i]=i;
        int ans=0,t=0;
        for(int i=1;i<=alen;i++)
        {
            int tx=findfa(a[i].x);
            int ty=findfa(a[i].y);
            if( tx!=ty)
    		{
                fa[ty]=tx;
                ans=ans+a[i].c;
                t++;if(t==n-1) break;
            }
        }
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    D130 最小生成树 Kruskal 算法 [USACO08OCT] Watering Hole G

    信息

    ID
    264
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    85
    已通过
    52
    上传者