数据结构-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算法&Kruskal算法)
最小生成树算法:Prim算法和Kruskal算法(来源:王道数据结构)
数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)