图的最小生成树prim算法模板

用prim算法构建最小生成树适合顶点数据较少而边较多的图

prim算法生成连通图的最小生成胡模板伪代码:

G为图,一般为全局变量,数组d为顶点与集合s的最短距离
Prim(G, d[]){
    初始化;
    for (循环n次){
        u = 使d[u]最小的还未访问的顶点的标号;
        记u 已被访问;
        for(从u出发到达的所有顶点v){
            if (v未被访问&&以u为中介点使得v与集合S的嘴短距离d[v]更优){
                将G[u][v]赋值给v与结合S的最短距离d[v];
            }
        }

    }
}

邻接矩阵版:

 1 //邻接矩阵版
 2 const int MAXV = 1000;            //最大顶点数
 3 const int INF = 1000000;        //设INF为一个很大的数
 4
 5 int n,m, G[MAXV][MAXV];            //n为顶点数,G为图
 6 int d[MAXV];                    //顶点与集合S的最短距离
 7 bool vis[MAXV] = { false };
 8
 9 //默认0号为初始点,函数返回最小生成树的边权之和
10 int prim(){
11     //初始化
12     fill(d, d + MAXV, INF);
13     d[0] = 0;
14     int ans = 0;            //存放最小生成树的边权之和
15     //遍历所有的顶点,每次遍历访问一个顶点
16     for (int i = 0; i < n; i++){
17         //找出当前还未访问但是距离集合S最近的顶点
18         int u = -1, MIN = INF;
19         for (int j = 0; j < n; j++){
20             if (vis[j] == false && d[j] < MIN){
21                 u = j;
22                 MIN = d[j];
23             }
24         }
25
26         //如果找不到这样的顶点
27         if (u == -1) return -1;
28
29         //标记这个顶点为已访问
30         vis[u] = true;
31         ans += d[u];
32
33         //遍历这个顶点的邻接点,如果没有访问且距离集合S更近,更新d[u]
34         for (int j = 0; j < n; j++){
35             if (vis[j] == false && G[u][j] != INF && G[u][j] < d[j]){
36                 d[j] = G[u][j];
37             }
38         }
39     }
40
41     return ans;
42 }

邻接表模板:

 1 const int MAXV = 1010;
 2 const int INF = 1000000;
 3
 4 struct Node{
 5     int v, dis;            //v为边的目标顶点,dis为权
 8 };
 9
10 vector<Node> Adj[MAXV];
11 int n, m;
12 int d[MAXV];
13 bool vis[MAXV] = { false };
14
15 int prim(){
16     fill(d, d + MAXV, INF);
17     d[0] = 0;
18     int ans = 0;
19
20     for (int i = 0; i < n; i++){
21         int u = -1, MIN = INF;
22         for (int j = 0; j < n; j++){
23             if (vis[j] == false && d[j] < MIN){
24                 u = j;
25                 MIN = d[j];
26             }
27         }
28
29         if (u == -1) return -1;
30         vis[u] = true;
31         ans += d[u];
32         for (int j = 0; j < Adj[u].size(); j++){
33             int v = Adj[u][j].v;
34             if (vis[v] == false && Adj[u][j].dis < d[v]){
35                 d[v] = Adj[u][j].dis;
36             }
37         }
38     }
39     return ans;
40 }

原文地址:https://www.cnblogs.com/hi3254014978/p/11497284.html

时间: 2024-08-04 11:50:27

图的最小生成树prim算法模板的相关文章

图的最小生成树——Prim算法

Prim算法 Prim算法求最小生成树是采取蓝白点的思想,白点代表已经加入最小生成树的点,蓝点表示未加入最小生成树的点. 进行n次循环,每次循环把一个蓝点变为白点,该蓝点应该是与白点相连的最小边权的是当前蓝点中最小的.这样就相当于向生成树中添加了n-1次最小的边,最后得到的一定是最小生成树. 1 #include<cstdio> 2 #include<cstring> 3 #define N 42000 4 using namespace std; 5 int next[N],to

最小生成树--prim算法

一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且其总价值最低,因此,最小生成树存在的充分必要条件为图G是连通的,简单点说如下: 1.树的定义:有n个顶点和n-1条边,没有回路的称为树 生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树 最小:指的是这些边加起来的权重之和最小 2.判定条件:向生成树中任加一条边都一定构成回路 充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在 上图的红色的边加上顶点就是原图的

hdu 3371 最小生成树prim算法

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8992    Accepted Submission(s): 2519 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thoug

poj1789Truck History(最小生成树prim算法)

题目链接: 啊哈哈,点我点我 思路:根据字符串中不同的长度建图,然后求图的最小生成树.. 题目: Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18272   Accepted: 7070 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for vege

数据结构:最小生成树--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中

E - Agri-Net (最小生成树) -- prim算法

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=193#problem/E prim算法 思想和步骤总结 (自己所写) dis[],map[][],vis[],pos ,min,ans(主要定义的变量) 首先,prim算法用于计算图边径长度已知的图,它所求的是将图中所有顶点相连接,所需要的最短路径的长度,prim算法适合计算稠密图,它的主要思想是贪心思想,贪心准则为每次选择未加入树中且距离树最小的顶点,并用dis[]数组不断更

hihocoer - 1097(最小生成树&#183;Prim算法)

题目链接: http://hihocoder.com/problemset/problem/1097 题目: #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通

Highways POJ-1751 最小生成树 Prim算法

Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输出需要添加边的两端点编号即可. 解题思路 这个可以使用最短路里面的Prim算法来实现,对于已经连接的城市,处理方式是令这两个城市之间的距离等于0即可. prim算法可以实现我们具体的路径输出,Kruskal算法暂时还不大会. 代码实现 #include<cstdio> #include<cs

prim算法模板

var g:array[1..10,1..10] of longint; d:array[1..10] of longint; f:array[1..10] of boolean; procedure prim; var i,j,k,min:longint; begin fillchar(g,sizeof(g),0); fillchar(f,sizeof(f),0); for i:=1 to n do d[i]:=g[1,i]; f[1]:=true; for i:=2 to n do begi