prim普里姆函数c语言,Prim算法(普里姆算法)

描述:

一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 n-1 条边。我们把构造连通网的最小代价生成树成为最小生成树。而Prim算法就是构造最小生成树的一种算法。

定义:

假设N = (P,{E})是连通网,TE是N上最小生成树中边的集合。算法从U = {U0}(U0属于V)。开始重复执行下述操作:在所有u属于U,v属于V-U的边(u,v)属于E中找到一条代价最小的边(u0,v0)并入集合TE,同事v0并入U,知道U = V为止。此时TE中必有n-1条边,则T = (V,{TE})为N的最小生成树

功能:

假设你是电信的实施工程师,需要为一个镇的九个村庄架设通信网络做设计,村庄零星地分布在这个镇中,每个村庄之间都有一定的距离,我们可以用prim算法找到一种连接方式。用这种方式可以保证总的路径最短。

时间复杂度:O(n2)

代码:

#include

#include

#define MAXVERTEX 10

#define INF 65535

typedef char VertexType;

typedef int EdgeType;

typedef struct MGraph

{

VertexType data[MAXVERTEX];

EdgeType edge[MAXVERTEX][MAXVERTEX];

int numVertex;

int numEdge;

}MGraph;

//构造一个图

void CreateMGraph(MGraph *G)

{

int i = 0,j = 0,k = 0,w = 0;

VertexType c;

printf("请输入顶点的数目和边的数目:中间用逗号隔开,回车表示结束:\n");

scanf("%d,%d",&G->numVertex,&G->numEdge);

fflush(stdin);

printf("请输入顶点存储的数据,以回车表示结束:\n");

scanf("%c",&c);

while(i < G->numVertex)

{

if(c == '\n')

break;

G->data[i] = c;

i++;

scanf("%c",&c);

}

for(i = 0;i < G->numVertex;i++)

{

for(j = 0;j < G->numVertex;j++)

{

if(i == j)

G->edge[i][j] = 0;

else

G->edge[i][j] = INF;

}

}

fflush(stdin);

for(k = 0;k < G->numEdge;k++)

{

printf("请输入边vi-vj依附顶点的下标 i 和 j ,以及权值w,中间用逗号隔开,回车表示结束:\n");

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

G->edge[i][j] = w;

G->edge[j][i] = G->edge[i][j];

}

printf("\n得到的邻接矩阵为:\n");

for(i = 0;i < G->numVertex;i++)

{

for(j = 0;j < G->numVertex;j++)

{

printf("%d ",G->edge[i][j]);

}

printf("\n");

}

}

void Prim(MGraph *G)

{

int i = 0,j = 0,k = 0,min,m;

int adjvex[MAXVERTEX];

int lowcost[MAXVERTEX];

for(i = 0;i < G->numVertex;i++)

{

adjvex[i] = 0;

}

lowcost[0] = 0;

for(i = 1;i < G->numVertex;i++)

{

lowcost[i] = G->edge[0][i];

}

for(i = 1;i < G->numVertex;i++)

{

j = 1,k = 0;

min = INF;

while(j < G->numVertex)

{

if(lowcost[j] != 0 && lowcost[j] < min)

{

min = lowcost[j];

k = j;

}

j++;

}

printf("(%d,%d) ",adjvex[k],k);

lowcost[k] = 0;

for(j = 1;j < G->numVertex;j++)

{

if(lowcost[j] != 0 && G->edge[k][j] < lowcost[j])

{

lowcost[j] = G->edge[k][j];

adjvex[j] = k;

}

}

}

}

int main()

{

MGraph G;

CreateMGraph(&G);

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

printf("\n运用Prim算法得到的最短路径为:\n");

Prim(&G);

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

return 0;

}

HDU 1879 继续畅通工程 &lpar;Prim(普里姆算法)&plus;Kruskal&lpar;克鲁斯卡尔&rpar;&rpar;

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最小生成树之Prim(普里姆)算法

关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...

最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法

Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

数据结构之---C语言实现最小生成树之prim(普里姆)算法

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

最小生成树---普里姆算法(Prim算法&rpar;和克鲁斯卡尔算法(Kruskal算法)

普里姆算法(Prim算法) #include using namespace std; #define MAXVEX 100 #define INF 6553 ...

ACM第四站————最小生成树(普里姆算法)

对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...

图-&gt&semi;连通性-&gt&semi;最小生成树&lpar;普里姆算法&rpar;

文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...

(原创)最小生成树之Prim(普里姆)算法&plus;代码详解,最懂你的讲解

Prim算法 (哈欠)在创建最小生成树之前,让我们回忆一下什么是最小生成树.最小生成树即在一个待权值的图(即网结构)中用一个七拐八绕的折线串连起所有的点,最小嘛,顾名思义,要权值相加起来最小,你当然可 ...

图结构练习——最小生成树(prim算法&lpar;普里姆&rpar;)

图结构练习——最小生成树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  有n个城市,其中有些城市之间可以修建公路,修建不同 ...

随机推荐

hdu5219 Repeating

后缀数组+莫比乌斯函数 #include #include #include using names ...

leetcode two sum python

class Solution: # @param {integer[]} nums # @param {integer} target # @return {integer[]} def twoSum ...

php mysq模糊查询l

范例

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值