0からn-1までの番号が付けられたn個の頂点を含む正の重み付き無向グラフが与えられます。最小サポートツリーを見つけてそのコストを計算するプログラムを作成してください。
入力形式:
入力には複数のデータセットが含まれています。データの各グループの最初の行は、2つの整数nとeであり、どちらも200を超えません。これらは、それぞれグラフの頂点とエッジの数を表します。次の行eは各エッジの情報を表し、各行には3つの非負の整数a、b、およびcが含まれます。ここで、aとbはエッジの端点番号を表し、cは重みを表します。辺は端点番号の順に配置されていません。
出力形式:
データセットごとに、最小スパニングツリーがある場合は、最小スパニングツリーの各辺の重みの合計である整数を出力します。最小スパニングツリーがない場合は、「最小全域木。」
入力サンプル:
4 5
0 1 1
0 3 1
1 3 5
1 2 1
2 3 8
4 2
0 1 1
2 3 8
サンプル出力:
3
最小全域木はありません。
使用されるクラスカルアルゴリズム、最小スパニングツリーの問題は、毎回配列を初期化してチェックすることを忘れないでください。接続されたグラフのみに最小全域木があります。n-1個のエッジを選択するだけです
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct {
int u;
int v;
int w;
} Edge;
int f[201];
bool cmp(Edge e1, Edge e2) {
return e1.w < e2.w; }
void init() {
for (int i = 0; i <= 200; i++) {
f[i] = i;
}
}
int find(int x) {
if (x == f[x])
return x;
return f[x] = find(f[x]);
}
int merge(int x, int y) {
int a = find(x);
int b = find(y);
if (a != b) {
f[b] = a;
return 1;
}
return 0;
}
int main() {
int n, e;
while (cin >> n >> e) {
Edge edge[e];
init();
for (int i = 0; i < e; i++) {
cin >> edge[i].u >> edge[i].v >> edge[i].w;
}
sort(edge, edge + e, cmp);
int cnt = 0, sum = 0;
for (int i = 0; i < e; i++) {
if (merge(edge[i].u, edge[i].v)) {
cnt++;
sum += edge[i].w;
}
if (cnt == n - 1)
break;
}
if (cnt == n - 1)
cout << sum << endl;
else
cout << "There is no minimum spanning tree." << endl;
}
return 0;
}