C ++はプリムアルゴリズムを実装しています

C ++はプリムアルゴリズムを実装しています

1.基本原則

MSTプロパティ:N =(V、E)を連結グラフとし、Uは頂点セットVの空でないサブセットです。エッジ(u、v)が最小の重みを持つエッジであり、uがUに属し、vがVUに属する場合、エッジ(u、v)を含む最小全域木が存在する必要があります。

例:ここに画像の説明を挿入
図に示すように、ポイントv1から開始して、ポイントv1をUに追加し、UからVUまでの最小の重みを持つエッジ(1)を探し、v3をUに追加して、再びUから最小の重みを探します。 to VUエッジが2の場合、v4をUに追加し、UからVUへの重みが最小のエッジ(2)を再度見つけます。v5をUに追加し、UからVUへの重みが最小のエッジを再度見つけます。これは3です。、v2をUに追加すると、最小スパニングツリーが完成します。結果は次のとおりです。ここに画像の説明を挿入

2.特定のコードの実装

注:各データグループはPrim関数で定義されているため、関数本体は比較的肥大化しているようです。実際、メインコードは2つの部分しかありません。1つは、各ポイントの最短辺をUからVUに更新することです。もう1つは、UからVUまでの最短辺を見つけることです。VUの最短辺。


```cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define Max  999999

void Prim(vector<vector<int> > V)
{
	vector<int> d;  //记录从U到V-U中各点的最短边
	vector<int> U;  //记录被加入到U中的点
	vector<bool> visited;  //记录点是否被加入U中
	vector<int> M;  //记录最终得到的各条边
	d.resize(V.size());
	visited.resize(V.size());
	fill(visited.begin(), visited.end(), false);

	U.push_back(0);
	visited[0] = true;
	fill(d.begin(), d.end(), Max);
	d[0] = 0;
	while (U.size() < V.size())
	{
		int x = U[U.size() - 1];         
		for (int i = 0; i < d.size(); ++i)  //更新从U到V-U中各点的最短边
		{
			if (!visited[i] && V[x][i] < d[i])
			{
				d[i] = V[x][i];
			}
		}
		int min = Max;
		int index = 0;
		for (int i = 0; i < d.size(); ++i)   //寻找从U到V-U的最短边
		{
			if (d[i] < min && !visited[i])
			{
				min = d[i];
				index = i;
			}
		}
		if (index == 0)
		{
			cout << "该图不连通" << endl;
			return;
		}
		visited[index] = true;
		U.push_back(index);
		M.push_back(min);
	}
	for (int i = 0; i < M.size(); ++i)  //输出所得最小生成树的各条边
	{
		cout << M[i] << "  ";
	}
}

int main()
{
	int n = 0;
	int m = 0;
	int u, v, w;
	cout << "输入节点个数:" << endl;
	cin >> n;
	cout << "输入边数:" << endl;
	cin >> m;
	vector<vector<int> > V;
	V.resize(n);
	for (int i = 0; i < n; ++i)
	{
		V[i].resize(n);
		for (int j = 0; j < n; ++j)
		{
			V[i][j] = Max;
		}
	}
	cout << "输入各条边的信息:" << endl;
	for (int i = 0; i < m; ++i)
	{
		cin >> u >> v >> w;
		V[u][v] = V[v][u] = w;
	}
	Prim(V);

	return 0;
}
输入输出信息:![在这里插入图片描述](https://img-blog.csdnimg.cn/20201002091216518.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2MDI3MjQz,size_16,color_FFFFFF,t_70#pic_center)


おすすめ

転載: blog.csdn.net/qq_46027243/article/details/108899750