7-5最小スパニングツリー(10ポイント)(クラスカルアルゴリズム)

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;
}

おすすめ

転載: blog.csdn.net/weixin_45845039/article/details/113339432