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