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

Posted hi3254014978

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的最小生成树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 

 

以上是关于图的最小生成树prim算法模板的主要内容,如果未能解决你的问题,请参考以下文章

图的最小生成树算法(Prim和Kruskal)

图的最小生成树算法?

图的最小生成树(普利姆prim算法)

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

无向带权图的最小生成树算法——Prim及Kruskal算法思路

Prim算法得到的图的最小生成树