数据结构-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//边数


原图:



源文件:



编译结果:

时间: 2024-08-24 17:03:50

数据结构-prim算法的相关文章

数据结构:最小生成树--Prim算法

最小生成树:Prim算法 最小生成树 给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost spanning tree). Prim算法 Prim算法是解决最小生成树的常用算法.它采取贪心策略,从指定的顶点开始寻找最小权值的邻接点.图G=<V,E>,初始时S={V0},把与V0相邻接,且边的权值最小的顶点加入到S.不断地把S中的顶点与V-S中顶点的最小权值边加入,直到所有顶点都已加入到S中

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

 一:Prim算法       1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Vertex (graph theory)).且其全部边的权值之和亦为最小. 该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现.并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该

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

图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph)表示的是顶点之间的邻接关系. (1) 无向图(undirect graph)      E中的每条边不带方向,称为无向图.(2) 有向图(direct graph)      E中的每条边具有方向,称为有向图.(3) 混合图       E中的一些边不带方向, 另一些边带有方向.(4) 图的阶      指

数据结构--图--最小生成树(Prim算法)

构造连通网的最小生成树,就是使生成树的边的权值之和最小化.常用的有Prim和Kruskal算法.先看Prim算法:假设N={V,{E}}是连通网,TE是N上最小生成树中边的集合.算法从U={u0}(uo属于V),TE={}开始,重复执行下述操作:在所有u属于U,v属于V-U的边(u,v)属于E中找到代价最小的一条边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止.此时TE中必有n-1条边,T={V,{TE}}为N的最小生成树.为实现此算法,需另设一个辅助数组closedge,以记录从U

数据结构(C实现)------- 最小生成树之Prim算法

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述 如果连通图是一个网,则称该网中所有生成树中权值总和最小的生成树为最小生成树,也称最小代价生成树.利用Prim算法构造的最小生成树方法思想: 假设G=(V,E)是一个具有n个顶点的连通网,顶点集V={v1,v2,...,vn}.设所求的最小生成树T=(U,TE),其中U是T的顶点集,TE是T的边集,U和TE初值均为空集. Prim算法的基本思想如下:首先从V中任取一

数据结构--画画--最小生成树(Prim算法)

通信网络的最小生成树配置,它是使右侧的生成树值并最小化.经常使用Prim和Kruskal算法.看Prim算法:以防万一N={V,{E}}它是在通信网络,TE它是N设置边的最小生成树.从算法U={u0}(uo属于V).TE={}开始,复运行下述操作:在全部u属于U.v属于V-U的边(u,v)属于E中找到代价最小的一条边(u0,v0)并入集合TE,同一时候v0并入U,直至U=V为止.此时TE中必有n-1条边,T={V,{TE}}为N的最小生成树. 为实现此算法,需另设一个辅助数组closedge,以

Prim算法(一)之 C语言详解

本章介绍普里姆算法.和以往一样,本文会先对普里姆算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 普里姆算法介绍 普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所

基本数据结构和算法回顾

最近想回过头来看看以前写的一些代码,可叹为何刚进大学的时候不知道要养成写博客的好习惯.现在好多东西都没有做记录,后面也没再遇到相同的问题,忘的都差不多了.只能勉强整理了下面写的一些代码,这些代码有的有参考别人的代码,但都是自己曾经一点点敲的,挂出来,虽然很基础,但希望能对别人有帮助. 链表 链表是一种非常基本的数据结构,被广泛的用在各种语言的集合框架中. 首先链表是一张表,只不过链表中的元素在内存中不一定相邻,并且每个元素都可带有指向另一个元素的指针. 链表有,单项链表,双向链表,循环链表等.

图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G).其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合.显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树. 深度优先生成森林   右边的是深度优先生成森林: 连通图的生成树不一定是唯一的,不同的遍历图的方法得到不同的生成树;从不