Module: スパニング ツリー: Kruskal のアルゴリズム


Problem

1/4

クラスカルのアルゴリズム: 始まり

Theory Click to read/hide

エッジの重みを指定したグラフ内の最小スパニング ツリーの例: 


クラスカルのアルゴリズム:

1) エッジを重みで並べ替えます 降順ではない
順に。 2) n 個のツリー (各頂点が 1 つのツリー) のリストを作成します。
3) これらのツリーを最小スパニング ツリーに結合するプロセスを開始します。
     すべてのエッジが横断され、現在のエッジの端が異なるサブツリーに属している場合、これらのサブツリーはマージされます。
4) すべてのエッジの列挙が終了すると、すべての頂点が同じサブツリーに属します。

Problem

接続されたグラフで最小重みスパニング ツリーを見つける必要があります。
 
入力データ形式:
 
入力ファイルの最初の行には、2 つの自然数 N、M (それぞれグラフの頂点とエッジの数) が含まれています。次の m 行には、エッジの説明が 1 行に 1 つずつ含まれています。エッジ番号 i は、エッジの端点とその重みをそれぞれ表す 3 つの自然数 Bi、Ei、Wi で表されます ( 1 <= B< sub>i、Ei <= N、0 <= Wi <= 232< /sup>-1.N <= 10、M <= 10)。
 
出力形式:
 
出力ファイルの唯一の行には、最小スパニング ツリーの重みである 1 つの自然数が含まれている必要があります。
 
<本体>
入る 出力
4 4
1 2 1
2 3 2
3 4 5
4 1 4
7
Write the program below
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

struct edge
{
	int l,a,b;
};

bool cmp(const edge &a, const edge &b)
{
    return a.l < b.l;
}

int main()
{
	int m, n;
	cin >> n >> m;

	vector < edge > g(m);

	for (int i = 0; i < m; i++)
	{
		int a, b, l;
		cin >> a >> b >>l;
		edge e;
                e.l = l; e.a= a-1; e.b = b-1;
		g[i] = e;
	}
	long long cost = 0;
	vector < pair<int, int> > res;

	sort(g.begin(), g.end(),cmp);
	vector<int> tree_id(n);
	for (int i = 0; i < n; ++i)
		tree_id[i] = i;
	for (int i = 0; i < m; ++i)
	{
		int a = g[i].a, b = g[i].b, l = g[i].l;
		if (tree_id[a] != tree_id[b])
		{        
			res.push_back(make_pair(a, b));
			int old_id = tree_id[b], new_id = tree_id[a];
			for (int j = 0; j < n; ++j)
				if (tree_id[j] == old_id)
					tree_id[j] = new_id;
		}
	}

	cout << cost;
	return 0;
}         

     

Program check result

To check the solution of the problem, you need to register or log in!