反正就各种错吧,看了好几遍代码,不知道是哪里有问题,求大佬指教。。
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int pre[10001];
int n, m;
struct edge {
int from, to, ss;
int cost;
}E[10001 * 10001];
void init() { //初始化
for (int i = 0; i <= n; ++i)
pre[i] = i;
}
int find(int x) { //查找
int r = x;
while (pre[r] != r)
r = pre[r];
return r;
}
void join(int x, int y) { //合并
int fx = find(x), fy = find(y);
if (fx != fy)
pre[fx] = fy;
}
bool same(int x, int y) {
return find(x) == find(y);
}
bool cmp(edge a, edge b) {
return a.cost < b.cost;
}
int kruskal() {
int ans = 0;
sort(E + 1, E + m + 1, cmp);
for (int i = 0; i <= m; ++i) {
if (same(E[i].from, E[i].to))
continue;
join(E[i].from, E[i].to);
ans += E[i].cost;
}
return ans;
}
int main() {
while (~scanf("%d", &m) && m) {
n = m * (m - 1) / 2;
init();
for (int i = 1; i <= n; ++i) {
scanf("%d %d %d %d", &E[i].from, &E[i].to, &E[i].cost, &E[i].ss);
if (E[i].ss == 1)
E[i].cost = 0;
}
int ans = kruskal();
printf("%d\n", ans);
}
return 0;
}