Prim算法求解最小生成树

Prim 算法

假设G=(VE)是一个具有n个顶点的带权无向连通图,T(UTE)G的最小生成树,其中UT的顶点集,TET的边集,则构造G的最小生成树T的步骤如下

1. 初始状态: TE 为空 , 任选一个顶点 v0 加入到 U
2. 所有 u∈U v∈V-U 的边 ( u v )∈E 中找一条代价最小的边 ( u′ v′) 并入 TE ,同时将 v′ 并入 U
重复操作 2 ,次数为 n-1 ,直到 U=V

 

 

/*==================================================*\
| Prim求最小生成树
| INIT: cost[][]耗费矩阵(inf为无穷大);
| CALL: prim(cost, n); 返回-1代表原图不连通;
\*==================================================*/

#include <iostream>
#include <string.h>

using namespace std;

const int MAX_WEIGHT = 10000000;
const int MAX_NUM = 100;

int weight[MAX_NUM][MAX_NUM]; /* 存储权值的二维数组 */
int low[MAX_NUM]; /* low数组记录(V-U)中每个顶点到U点集的最小权值*/
bool U[MAX_NUM]; /*  判断是否已经存入点到集合 */

int prim(int n)
{
 int ret = 0;

 /* 从某点开始,分别标记和记录该点*/
 U[0] = true;
 int u = 0;

 /* 第一次通过初始点u到每个点的权值给low赋值*/
 for(int i = 0; i < n; i++) {
  if(i != u)
   low[i] = weight[u][i];
 }

 /*  再运行n-1次 */
 for(int i = 0; i < n-1; i++) {
  /* 从(V-U)找出最小权值并记录位置 */
  int min = MAX_WEIGHT;
  for(int j = 0; j < n; j++) {
   if(!U[j] && min > low[j]) {
    min = low[j];
    u = j;
   }
  }

  /* 叠加min到结果值ret中,此处即为TE的生成过程,如果想要知道详细路径可以在此记录 */
  ret += min;

  /* 将u加入到点集U中 */
  U[u] = true;

  /* 通过新加入到点集U中的点u更新数组low,只更新(V-U)中的顶点对应的low值*/
  for(int j = 0; j < n; j++) {
   if(!U[j]&& low[j] > weight[u][j])
    low[j] = weight[u][j];
  }
 }

 return ret;
}

int main()
{
 memset(U, 0, sizeof(U));
 memset(low, 0, sizeof(low));
 memset(weight, 0, sizeof(weight));

 int N; /* 顶点数*/
 int E; /*边数*/
 cin >> N;
 cin >> E;
 for (int i = 0; i < E; ++i) {
  int v1, v2;
  cin >> v1;
  cin >> v2;
  cin >> weight[v1][v2];
  weight[v2][v1] = weight[v1][v2];
 }

 for (int i = 0; i < N; i++) {
  for (int j = 0; j < N; j++) {
   if (weight[i][j] == 0)
    weight[i][j] = MAX_WEIGHT;
  }
 }

 for (int i = 0; i < N; i++)
  low[i] = MAX_WEIGHT;

 cout << prim(N) << endl;

 return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值