/* prim算法 */ #include<stdio.h> #include<string.h> int map[110][110],vis[110],dist[110]; int n; void geng(int j)//更新剩余节点到树的最小距离 { int max=999999999,i; for(i=1;i<=n;i++) if(vis[i]&&map[i][j]<max) max=map[i][j]; dist[j]=max; } int zhao()//找剩余节点中离树最近的 { int xia=-1,i; for(i=1;i<=n;i++) if(vis[i]==0&&(xia==-1||dist[i]<dist[xia])) xia=i; return xia; } int prim() { int max=0,i,j,xia; for(i=1;i<=n;i++) dist[i]=map[1][i]; memset(vis,0,sizeof(vis)); vis[1]=1; for(i=2;i<=n;i++) { xia=zhao(); vis[xia]=1; max+=dist[xia];//加上选入树的线段长度 for(j=1;j<=n;j++) if(vis[j]==0) geng(j); } return max; } int main() { int i,j; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); printf("%d\n",prim()); } return 0; }
/* kruskal算法 */ #include<stdio.h> #include<stdlib.h> int map[110][110],set[110]; struct e { int x,y,w; }b[5000]; int n,num; int cmp(const void *a,const void *b)//按边的权排序 { struct e *c=(struct e *)a,*d=(struct e *)b; return c->w-d->w; } int root(int i) { while(set[i]!=i) i=set[i]; return i; } int kruskal() { int i,ding=0,xx,yy,r=0; for(i=1;i<=n;i++) set[i]=i; for(i=2;i<=n;i++) { xx=root(b[ding].x); yy=root(b[ding].y); while(xx==yy)//寻找不会产生回路的边 { ding++; xx=root(b[ding].x); yy=root(b[ding].y); } if(xx<yy) set[yy]=xx; else set[xx]=yy; r+=b[ding].w; ding++; } return r; } int main() { int i,j; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); num=0; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { b[num].x=i; b[num].y=j; b[num++].w=map[i][j]; } qsort(b,num,sizeof(b[0]),cmp); printf("%d\n",kruskal()); } return 0; }