数据结构-prim算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-prim算法相关的知识,希望对你有一定的参考价值。

prim的c语言算法实现:

#include<stdio.h>

#include<stdlib.h>


#define VEXNUM 6//顶点数,,,根据原图而定

#define ARCNUM 10//边数,,,根据原图而定

#define MAX_VAL 100//先定义最大权值;


int s_set[VEXNUM+1], s_count;//标记被加入最小生成树的点与数量

int vs_count;//标记原来树中节点的数目;


struct Graph{

int vexs[VEXNUM+1];//顶点数组;

    int a[VEXNUM+1][VEXNUM+1];//邻接矩阵;

int val[VEXNUM+1][VEXNUM+1];//权值;

};

typedef struct{//记录已加入最小生成树的边的情况:端点、权值;

   int a;

   int v;

   int cost;

}closedge;


void create(struct Graph *);//创建图;

void prim(closedge  clo[ARCNUM],struct Graph *);//实现prim


void main()

{  

closedge  clo[ARCNUM];

struct Graph *g=NULL;

g=(struct Graph *)malloc(sizeof(struct Graph));//分配空间;

create(g);

prim(clo,g);

}


void prim(closedge  clo[ARCNUM],struct Graph *g){

int i,j,k,q,w;

for(i=1;i<=VEXNUM;i++){

s_set[i]=0;

}

s_count=0;

vs_count=VEXNUM;

s_set[1]=1;s_count++;

vs_count--;


while(true){

int x=MAX_VAL;

for(j=1;j<=VEXNUM;j++){

if(s_set[j]==1){

for(k=1;k<=VEXNUM;k++){

if((k!=j)&&(s_set[k]==0)){

if(x>(g->val[k][j])&&g->val[k][j]!=0)

{

x=g->val[k][j];

q=j;w=k;

}

}

}

}

}

clo[s_count-1].a=q;clo[s_count-1].v=w;clo[s_count-1].cost=x;

printf("结点A:%d   结点B:%d   边:%d\n",clo[s_count-1].a,clo[s_count-1].v,clo[s_count-1].cost);

s_set[w]=1;s_count++;

vs_count--;

if(vs_count==0)

break;

}

}


void create(struct Graph *g)

{

int i,j,n,x,y,z;

FILE *fp;

fp=fopen("E:\\prim.txt","r");

for(n=1;n<=VEXNUM;n++)

   g->vexs[n]=n; 

for(i=1; i<=VEXNUM; i++)

        for(j=1; j<=VEXNUM; j++){

g->a[i][j] = 0;

g->a[j][i] = g->a[i][j];

}

for(i=0; i<ARCNUM; i++){

//fscanf(fp,"%d,%d,%d",&x,&y,&z);在此程序的错误输入格式

fscanf(fp,"%d%d%d",&x,&y,&z);// printf("%d %d %d\n",x,y,z);

g->a[x][y] = 1;

g->a[y][x]=g->a[x][y];

g->val[x][y]=z;

g->val[y][x]=g->val[x][y];

}

fclose(fp);

for(i=1; i<=VEXNUM; i++)

{

for(j=1; j<=VEXNUM; j++)

if(g->val[i][j]<0)

g->val[i][j]=0;

}

/**可以显示图的邻接矩阵

for(i=1; i<=VEXNUM; i++)

{

for(j=1; j<=VEXNUM; j++)

{

printf("%d\t",g->a[i][j]);

}

printf("\n");

}

printf("\n");printf("\n");printf("\n");

for(i=1; i<=VEXNUM; i++)

{

for(j=1; j<=VEXNUM; j++)

if(g->val[i][j]>0)

printf("%d\t",g->val[i][j]);

else{

g->val[i][j]=0;

printf("%d\t",g->val[i][j]);

}

printf("\n");

}

*/

}


测试用例一:


#define VEXNUM 6//顶点数

#define ARCNUM 10//边数



原图:技术分享



源文件:技术分享



编译结果:技术分享






测试用例二:

#define VEXNUM 7//顶点数

#define ARCNUM 11//边数


原图:技术分享



源文件:技术分享



编译结果:技术分享





本文出自 “11773640” 博客,请务必保留此出处http://11783640.blog.51cto.com/11773640/1865170

以上是关于数据结构-prim算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法系列----最小生成树(Prim算法&amp;Kruskal算法)

最小生成树算法:Prim算法和Kruskal算法(来源:王道数据结构)

数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)

数据结构-prim算法

数据结构与算法系列研究七——图prim算法dijkstra算法

Prim算法