最小生成树--模板

题意:N个城堡,M个桥,每个桥的权值都不一样,题目要求能使城堡彼此联通的所有桥集合里面权值最小的那种,由此可以判断这是一道求最小生成树的题。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;

const int maxn = 2000 + 5, maxm = 2e5 + 5;
struct edge {
    int u, v, value;
}myedge[maxm];
int p[maxn], n, m;

bool cmp(const edge&p1,const edge&p2) {
    return p1.value < p2.value;
}

int find(int x) {
    return (p[x] == x) ? x : (p[x] = find(p[x]));
}

int main() {
    scanf("%d%d", &n, &m);
    int a, b, id, k = 0;
    ll w;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%lld%d", &a, &b, &w, &id);
        if (id == 1) {
            myedge[k].u = a;
            myedge[k].v = b;
            myedge[k].value = w;
            k++;
        }
    }
    if (k != 0) {
        for (int i = 0; i < n; i++) {
            p[i] = i;
        }
        sort(myedge, myedge + k, cmp);
        int x, y, counter = 0;
        ll value, sum = 0;
        for (int i = 0; i < k; i++) {
            value = myedge[i].value;
            x = find(myedge[i].u);
            y = find(myedge[i].v);
            if (x != y) {
                sum += value;
                p[y] = x;
                counter++;
                if (counter >= n - 1) break;
            }
        }
        printf("yes\n%lld\n", sum);
    }
    else printf("no");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38995588/article/details/80620874