2 条题解

  • 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;
    }
    
    • 0
      @ 2025-10-8 16:48:49
      #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 算法 P1550 [USACO08OCT] Watering Hole G

      信息

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