prim算法的邻接图和邻接表方式实现

prime算法:

        prime算法用来解决最小生成树的问题,其基本思想是对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合V-S中选择与集合S的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令顶点u为中介点,优化所有从u能到达的顶点v与集合S之间的最短距离。这样的操作执行n次(n为顶点个数),直到集合S已包含所有的顶点。

#include 
#include
#include
using namespace std;
const int MAXV = 1000;//最大顶点数
const int INF = 1000000000;

//邻接矩阵版
int n, G[MAXV][MAXV];
int d[MAXV];//顶点与集合s的最短距离
bool vis[MAXV] = { false };

int prime()//默认0号为初始起点,函数返回最小生成树的边权之和
{
	fill(d, d + MAXV, INF);
	d[0] = 0;
	int ans = 0;//存放最小生成树的边权之和
	for (int i = 0; i < n; i++)//循环n次
	{
		int u = -1, MIN = INF;
		for (int j = 0; j < n; j++)
		{
			if (vis[j] == false && d[j] < MIN)
			{
				u = j;
				MIN = d[j];
			}
		}
		if (u == -1) return -1;//因为给定的顶点都是连通的,n个循环会有n个顶点加入,所以一般不会触发
		vis[u] = true;
		ans += d[u];//将于集合s距离最小的边加入最小生成树
		for (int v = 0; v < n; v++)
		{
			if (vis[v] == false && G[u][v]!=INF)
			{
				if (G[u][v] < d[v]) {
					d[v] = G[u][v];
					
				}
			}
		}
	}
	return ans;
}


//邻接表版
struct Node {
	int v, dis;
};
vectorAdj[MAXV];

int prime()//默认0号为初始起点,函数返回最小生成树的边权之和
{
	fill(d, d + MAXV, INF);
	d[0] = 0;
	int ans = 0;//存放最小生成树的边权之和
	for (int i = 0; i < n; i++)//循环n次
	{
		int u = -1, MIN = INF;
		for (int j = 0; j < n; j++)
		{
			if (vis[j] == false && d[j] < MIN)
			{
				u = j;
				MIN = d[j];
			}
		}
		if (u == -1) return -1;//因为给定的顶点都是连通的,n个循环会有n个顶点加入,所以一般不会触发
		vis[u] = true;
		ans += d[u];//将于集合s距离最小的边加入最小生成树
		for (int j= 0; j< Adj[u].size(); j++)
		{
			if (vis[j] == false &&Adj[u][j].dis

 

你可能感兴趣的:(数据结构)