码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-09-10 14:44:53      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:turn   函数   目标   最小   函数返回   for   +=   中介   全局变量   

用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算法模板

标签:turn   函数   目标   最小   函数返回   for   +=   中介   全局变量   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!