最小生成树算法 1.Prim算法

最小生成树(MST):一个有N个点的图,边一定是大于等于N-1条边的。在这些边中选择N-1条出来,连接所有N个点。这N-1条边的边权之和是所有方案中最小的。

Prim算法的时间复杂度时O(n^2)的,因此适用于稠密图的最小生成树,如果是稀疏图的情况下采用Kruskal算法更好。

Prim算法蕴含了贪心的思想,其原理是把图中所有的点分成两个集合,一个集合(V)是已经在生成树中的点,另一个集合(G)是不在生成树中的点,然后寻找起点在V中,终点在G中的边中权值最小的边加入生成树,然后把终点从G移到V中,最后直到G中没有元素即可。这样做既保证了最小生成树的要求也不会产生回路。

code:

#include<stdio.h>
#include<stdlib.h>
#define max 10000000
int g[7][7]={{max,2,max,max,max,3,max},
                 {2,max,3,10,max,5,max},
                 {max,3,max,6,7,max,max},
                 {max,10,6,max,5,9,max},
                 {max,max,7,5,max,3,15},
                 {3,5,max,9,3,max,max},
                 {max,max,max,max,15,max,max}}; int i,dist[7],flag[7]={},j,s=0;
void prim(int vi){

    for(i=0;i<7;i++)
        dist[i]=g[vi][i];
    flag[vi]=1;
    for(i=0;i<6;i++){
        int min=max;
        int k;

        for(j=0;j<7;j++){
            if(dist[j]<min && !flag[j]){
                k=j;
                min=dist[j];
            }
        }
        flag[k]=1;
        for(j=0;j<7;j++){
            if(dist[j]>g[k][j])
             dist[j]=g[k][j];
        }
    }
}
int main(){
    int i,j;
    prim(1);
    for(i=1;i<7;i++) {
    s+=dist[i];
    printf("%d\n",dist[i]);}
    printf("%d",s);
    return 0;
}

原文地址:https://www.cnblogs.com/uncklesam7/p/9090364.html

时间: 2024-08-14 20:54:52

最小生成树算法 1.Prim算法的相关文章

hdu 1162 Eddy&amp;#39;s picture (Kruskal算法,prim算法,最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法.保证联通的线路最短,典型的最小生成树问题. 方法一 . 通过不断找到最小的边来找到终于结果. Kruskal 算法 #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespac

hdu 1162 Eddy&#39;s picture (Kruskal算法,prim算法,最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法,保证联通的线路最短,典型的最小生成树问题. 方法一 , 通过不断找到最小的边来找到最终结果. Kruskal 算法 #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespac

转 最小生成树(kruskal 算法 和prim算法)

链接:http://blog.csdn.net/weinierbian/article/details/8059129/ 给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 求最小生成树的算法(1) 克鲁斯卡尔算法图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间.(2) 普里姆算法图的存贮结构采用邻接矩阵.此方法是按各个顶点连通的步骤进行,需要用一个顶点集合,开始为空集,以后将以连通的顶点

HDU - 1301 - Jungle Roads (最小生成树!!prim算法!!)

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4572    Accepted Submission(s): 3354 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst o

HDU - 1863 - 畅通工程 (最小生成树!!prim算法!!)

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18223    Accepted Submission(s): 7726 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

Dijkstra算法与Prim算法辨析

这两个算法真的很像,尽管它们的用处截然不同. Dijkstra是找单源非负的最短路径. Prim是找最小生成树. Dijkstra算法都是找当前标记集合点再扩一条边所形成的最短路径,然后更新标记点集,外扩路径集. Prim是找当前标记集合点再扩一条边中所形成的的最短边,然后更新标记点集,外扩边集. 所以细节上是有不同的. Dijkstra复杂度O(N2), Prim O(eloge).

数据结构(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算法&amp;amp;Kruskal算法)

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

[迷宫中的算法实践]迷宫生成算法&mdash;&mdash;Prim算法

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