Kruskal_最小生成樹_演算法
阿新 • • 發佈:2018-12-14
//註釋儘早補上
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<malloc.h> #define INF 99999 #define MAXV 100 using namespace std; typedef struct { int no; }VertexType; typedef struct { int edges[100][100]; int n,e; VertexType vexs[100]; }MatGraph; typedef struct { int u; int v; int w; }Edge; void sssort(Edge E[100],int k) { for(int i=0;i<k;i++) { for(int j=0;j<k-1;j++) { if(E[j].w>E[j+1].w) { swap(E[j],E[j+1]); } } } } void CreatMat(MatGraph &g,int A[6][10],int n,int e) { int i,j; g.n=n; g.e=e; for(i=0;i<g.n;i++) { for(j=0;j<g.n;j++) { g.edges[i][j]=A[i][j]; } } } void DispMat(MatGraph g) { int i,j; for(i=0;i<g.n;i++) { for(j=0;j<g.n;j++) { if(g.edges[i][j]!=INF) { printf("%4d",g.edges[i][j]); } else { printf("%4s","#"); } } cout<<endl; } } void Kruskal(MatGraph &g) { int i,j,k; int u1,v1,sn1,sn2; int vest[100]; Edge E[110]; k=0; for(i=0;i<g.n;i++) { for(j=0;j<=i;j++) { if(g.edges[i][j]!=0&&g.edges[i][j]!=INF) { E[k].u=i; E[k].v=j; E[k].w=g.edges[i][j]; k++; } } } sssort(E,k); for(i=0;i<g.n;i++) { vest[i]=i; } k=1; j=0; while(k<g.n) { u1=E[j].u; v1=E[j].v; sn1=vest[u1]; sn2=vest[v1]; if(sn1!=sn2) { printf("Edge(%d,%d):%d\n",u1,v1,E[j].w); k++; for(i=0;i<g.n;i++) { if(vest[i]==sn2) { vest[i]=sn1; } } } j++; } } int main() { MatGraph g; int A[6][10]={ {0,5,8,7,INF,3}, {5,0,4,INF,INF,INF}, {8,4,0,5,INF,9}, {7,INF,5,0,5,6}, {INF,INF,INF,5,0,1}, {3,INF,9,6,1,0}}; CreatMat(g,A,6,10); DispMat(g); cout<<endl; Kruskal(g); return 0; }