大会员可查看代码,点此开通大会员
/*最小生成树 kruskal
已经存在的就要提前merge
*/
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 110;
const int MAXM = 5500;
struct Edge{
int u, v;
int cost;
}E[MAXN];
int n, m;
int father[MAXN];
int ans = 0; int eNum = 0;
bool cmp(Edge a, Edge b) {
return a.cost < b.cost;
}
int find(int x) {
int a = x;
while(x != father[x]) {
x = father[x];
}
while(a != father[a]) {
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
int kruskal(int n, int m) {
for(int i = 1; i <= n; i++) {
father[i] = i;
}
sort(E, E + m, cmp);
for(int i = 0; i < m; i++) {
int faU = find(E[i].u);
int faV = find(E[i].v);
if(faU != faV) {
father[faU] = faV;
ans += E[i].cost;
eNum++;
if(eNum == n - 1) break;
}
}
if(eNum != n - 1) return -1;
else return ans;
}
int main() {
int t;
int u, v, state, cost;
while(true) {
scanf("%d", &t);
if(t == 0) break;
else {
ans = 0, eNum = 0;
for(int i = 0; i < t * (t - 1) / 2; i++) {
scanf("%d%d%d%d", &u, &v, &cost, &state);
E[i].u = u, E[i].v = v, E[i].cost = cost;
if(state == 1) {
// int faU = find(E[i].u);
// int faV = find(E[i].v);
// if(faU != faV) {
// father[faU] = faV;
// //ans += E[i].cost;
// eNum++;
// //if(eNum == n - 1) break;
//}
E[i].cost = 0;
}
}
printf("%d\n", kruskal(t, t * (t - 1) / 2));
}
}
return 0;
}