最小生成樹--模板
阿新 • • 發佈:2019-01-30
題意: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;
}