描述:

  一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 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 <stdio.h>
#include <stdlib.h>
#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;
}

  

Prim算法(普里姆算法)的更多相关文章

  1. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

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

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

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

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

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

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

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

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

    普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...

  6. 普里姆算法(Prim)

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

  7. 查找最小生成树:普里姆算法算法(Prim)算法

    一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...

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

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

  9. 图->连通性->最小生成树(普里姆算法)

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

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

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

随机推荐

  1. android 获取屏幕尺寸

    文章转载自:http://blog.csdn.net/congqingbin/article/details/7474276// 通过WindowManager获取 DisplayMetrics dm ...

  2. 详解AJAX核心 —— XMLHttpRequest 对象 (上)

    我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊.新手或者对低层还不是很了解的人可以看看,帮助理解与记忆. XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程 ...

  3. hibernate报错:org.hibernate.MappingException: No Dialect mapping for JDBC type: -1

    解决方法:自定义一个Hibernate Dialect. package com.yourcompany.util ; import java.sql.Types; import org.hibern ...

  4. [Effective Modern C++] Item 6. Use the explicitly typed initializer idiom when auto deduces undesired types - 当推断意外类型时使用显式的类型初始化语句

    条款6 当推断意外类型时使用显式的类型初始化语句 基础知识 当使用std::vector<bool>的时候,类型推断会出现问题: std::vector<bool> featu ...

  5. JavaScript中setTimeout和setInterval的使用

    相同点:这两个方法都可以用来实现在一个固定的时间之后去实现JavaScript代码,两个方法都包含有两个参数,第一个是将要执行的代码字符串,第二是以毫秒为单位的时间间隔,当过了这个时间间隔之后就会执行 ...

  6. 从汇编看c++成员函数指针(三)

    前面的从汇编看c++中成员函数指针(一)和从汇编看c++成员函数指针(二)讨论的要么是单一类,要么是普通的多重继承,没有讨论虚拟继承,下面就来看一看,当引入虚拟继承之后,成员函数指针会有什么变化. 下 ...

  7. java口算器

    package dd;import javax.swing.*; import java.awt.*;import java.awt.event.*;class Main extends JFrame ...

  8. 一种获取spring环境上下文方法:SpringContextUtil

    获得spring里注册Bean的有好几种方法,这里介绍一种比较简单的方法: import org.springframework.beans.BeansException; import org.sp ...

  9. Fragment之一:Fragment入门

    参考自张泽华视频 Fragment是自Android3.0后引入的特性,主要用于在不同的屏幕尺寸中展现不同的内容. Fragment必须被嵌入Activity中使用,总是作为Activity的组成部分 ...

  10. Windows 下 Apache HTTP Server 安装、配置以及与 Tomcat 的整合(附图)

    如果您能点开这篇文章,说明您已对熟悉Apache HTTP Server(下文用Apache简称)配置的重要性已很清楚了,本文不在赘述,直接介入正题,请往下阅读: 为便于阅读,列出文章目录: 一.Ap ...