1. 程式人生 > >最小生成樹--模板

最小生成樹--模板

題意: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; }