// 邻接矩阵构建最小生成树(PRIM算法) /*#include<stdio.h> #include<stdlib.h> #define N 10000 #define MAX 100 int lowcost[MAX],closest[MAX],s[MAX]; typedef struct { int n,e; int egde[MAX][MAX]; }matrix_graph; matrix_graph *g=(matrix_graph *)malloc(sizeof(matrix_graph)); void create(matrix_graph *g) { int i,v,u,k; scanf("%d%d",&g->n,&g->e); for(i=0;i<g->n;i++) for(k=0;k<g->n;k++) { if(i==k)g->egde[i][k]=0; else g->egde[i][k]=N; } for(i=0;i<g->n;i++) { s[i]=0; lowcost[i]=0; closest[i]=-1; } for(i=0;i<g->e;i++) { scanf("%d%d%d",&u,&v,&k); g->egde[v][u]=g->egde[u][v]=k; } } void prim(matrix_graph *g) { int i,j,k=0,min,x=0; //初始化 s[0]=1; for(i=1;i<g->n;i++) { lowcost[i]=g->egde[0][i]; if(lowcost[i]!=N) closest[i]=0; } for(i=1;i<g->n;i++) { min=N; for(j=0;j<g->n;j++) { if(!s[j]&&lowcost[j]<min) { min=lowcost[j]; x=j; } } s[x]=1; for(k=1;k<g->n;k++) { if(!s[k]&&lowcost[k]>g->egde[x][k]) { lowcost[k]=g->egde[x][k]; closest[k]=x; } } } for(i=0;i<g->n;i++) printf("%d %d/n",lowcost[i],closest[i]); } void back()//回溯,找寻构建的边 { int i; for(i=1;i<g->n;i++) { printf("(%d,%d)/n",i,closest[i]); } return ; } int main() { create(g); prim(g); back(); return 0; }*/ //结构体构建最小生成数(KRUSKAL算法) #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct node { int x,y,m; bool mark; }egdeNode; int n,e; int bin[MAX]; egdeNode p[MAX]; int cmp(const void *a,const void *b) { struct node *c=(node *)a; struct node *d=(node *)b; if(c->m!=d->m)return c->m-d->m; else return c->x-d->x; } int find(int x) { if(x!=bin[x]) bin[x]=find(bin[x]); return bin[x]; } void Union(int x,int y,int i) { x=find(x); y=find(y); if(x==y)return ; else { x>y?bin[x]=y:bin[y]=x; p[i].mark=1; } return ; } int main() { int i,u,v,k; scanf("%d%d",&n,&e); for(i=0;i<n;i++) bin[i]=i; for(i=0;i<e;i++) { scanf("%d%d%d",&u,&v,&k); p[i].x=u; p[i].y=v; p[i].m=k; p[i].mark=0; } qsort(p,e,sizeof(p[0]),cmp); for(i=0;i<e;i++) { Union(p[i].x,p[i].y,i); } for(i=0;i<e;i++) { if(p[i].mark) { printf("(%d,%d)/n",p[i].x,p[i].y); } } return 0; }