kruskal
#include<bits/stdc++.h> #define F(i,s,e) for(int i=s;i<=e;i++) #define D(i,e,s) for(int i=e;i>=s;i--) using namespace std; int n,a[110][110]; int ans=0,father[510]; struct edge { int x,y; int w; }e[110]; int len=0; void push(int xx,int yy,int ww) { e[len++].x=xx;e[len].y=yy;e[len].w=ww; } int getfather(int k) { int q=k; while(q!=father[q]) q=father[q]; while(q!=k) { int temp=father[k]; father[k]=q; k=temp; } return q; } void init() { scanf("%d",&n); F(i,1,n) F(j,1,n) scanf("%d",&a[i][j]); F(i,1,n) F(j,i,n) { int temp=min(a[i][j],a[j][i]); push(i,j,temp); push(j,i,temp); } } bool cmp(edge o,edge p){ return(o.w<p.w);} void merge(int xx,int yy) { int fx=getfather(xx); int fy=getfather(yy); father[fx]=fy; } void Kruskal() { F(i,1,n) father[i]=i; sort(e+1,e+1+len,cmp); int got=0; F(i,1,len) { int u=getfather(e[i].x); int v=getfather(e[i].y); if(u!=v) { merge(u,v); ans+=e[i].w; if(++got==len-1) return; } } } int main() { init(); Kruskal(); printf("%lld\n",ans); return 0; }
浙公网安备 33010602011771号