分别利用prim算法和kruskal算法实现求图的最小生成树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*分别利用prim算法和kruskal算法实现求图的最小生成树*/ #include

#include

#define MaxVertexNum 12

#define MaxEdgeNum 20

#define MaxValue 1000

typedef int Vertextype;

typedef int adjmatrix[MaxVertexNum][MaxVertexNum]; typedef Vertextype vexlist[MaxVertexNum];

int visited[MaxVertexNum]={0};

struct edgeElem

{int fromvex;

int endvex;

int weight;

};

typedef struct edgeElem edgeset[MaxVertexNum];

void Creat_adjmatrix(vexlist GV,adjmatrix GA,int n,int e) {int i,j,k,w;

printf("输入%d个顶点数据",n);

for(i=0;i

scanf("%d",&GV[i]);

for(i=0;i

for(j=0;j

if(i==j) GA[i][j]=0;

else GA[i][j]=MaxValue;

printf("输入%d条无向带权边",e);

for(k=0;k

{

scanf("%d%d%d",&i,&j,&w);

GA[i][j]=GA[j][i]=w;

}

}

void Creat_edgeset(vexlist GV,edgeset GE,int n,int e) {int i,j,k,w;

printf("输入%d个顶点数据",n);

for(i=0;i

scanf("%d",&GV[i]);

printf("输入%d条无向带权边",e);

for(k=0;k

{ scanf("%d%d%d",&i,&j,&w);

GE[k].fromvex=i;

GE[k].endvex=j;

GE[k].weight=w;

}

}

void output_edgeset(edgeset GE,int e)

{int k;

for(k=0;k

printf("%d %d %d,",GE[k].fromvex,GE[k].endvex,GE[k].weight); printf("\n");

}

void prim(adjmatrix GA,edgeset CT,int a,int n)

{int i,j,t,k,w,min,m;

struct edgeElem x;

for(i=0;i

if(i

{CT[i].fromvex=a;

CT[i].endvex=i;

CT[i].weight=GA[a][i];

}

else if(i>a)

{CT[i-1].fromvex=a;

CT[i-1].endvex=i;

CT[i-1].weight=GA[a][i];

}

for(k=1;k

{

min=MaxValue;

m=k-1;

for(j=k-1;j

if(CT[j].weight

x=CT[k-1];CT[k-1]=CT[m];CT[m]=x;

j=CT[k-1].endvex;

for(i=k;i

{t=CT[i].endvex;w=GA[j][t];

if(w

{CT[i].weight=w;

CT[i].fromvex=j;

}

}

}

}

void kruskal(edgeset GE,edgeset C,int n)

{ int i,j,k,d;

int m1,m2;

adjmatrix s;

for(i=0;i

{for(j=0;j

if(i==j) s[i][j]=1;else s[i][j]=0;

}

k=1;

d=0;

while(k

{

for(i=0;i

{if(s[i][GE[d].fromvex]==1) m1=i;

if(s[i][GE[d].endvex]==1) m2=i;

}

if(m1!=m2)

{C[k-1]=GE[d];k++;

for(j=0;j

{s[m1][j]=s[m1][j]||s[m2][j];

s[m2][j]=0;

}

}

d++;

}

}

void main()

{int n,e;

vexlist GV;

adjmatrix GA;

edgeset GE,C;

printf("输入图的顶点数和边数:");

scanf("%d%d",&n,&e);

Creat_adjmatrix( GV, GA, n, e);

printf("利用prim算法从0点出发求图的最小生成树:\n");

相关文档
最新文档