/* * 最小生成树,已修建的道路费用为0 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 101 #define MAXM 10001 #define INF 0x3f3f3f3f struct Edge { int u, v, w; }edge[MAXM]; int e_cnt, root[MAXN]; void insert_arc(int u, int v, int w) { edge[e_cnt].v = v; edge[e_cnt].w = w; edge[e_cnt ++].u = u; } int cmp(const struct Edge &a, const struct Edge &b) { return a.w < b.w; } int get_root(int x) { if( x == root[x] ) { return x; } return root[x] = get_root(root[x]); } int min_spanning_tree(int vertex) { int rx, ry, ans(0); for(int i = 1; i <= vertex; i ++ ) { root[i] = i; } for(int i = 1; i < vertex; i ++) { for(int j = 0; j < e_cnt; j ++) { rx = get_root(edge[j].u); ry = get_root(edge[j].v); if( rx != ry ) { root[rx] = ry; ans += edge[j].w; break; } } } return ans; } int main(int argc, char const *argv[]) { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); #endif int vertex, arc, u, v, w, mark; while( scanf("%d", &vertex) && vertex ) { arc = (vertex*(vertex-1))/2; e_cnt = 0; for(int i = 0; i < arc; i ++) { scanf("%d %d %d %d", &u, &v, &w, &mark); if( !mark ) { insert_arc(u, v, w); } else { insert_arc(u, v, 0); } } sort(edge, edge+e_cnt, cmp); printf("%d\n", min_spanning_tree(vertex)); } return 0; }