一、注意事项:

  1. 预备数据结构:
  2. vector<Edge> edges; 存储尚未修建的路(边)
  3. edge_cnt:计算已修建的边数目。
  4. 已修建的路可以不加入 edges 中。
  5. edge_cnt:
  6. 注意:从输入时就开始计算,并且只有加入该边不形成环时才edge_cnt++;
  7. 本人错因:未判断是否成环就++了。(即第55行代码 需要判断 same(s,t) )

二、代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int num = 101;
vector<int> father(num);

void init() {
    for(int i = 0; i<num; i++) father[i] = i;
}

int find(int u) {
    if(u==father[u]) return u;
    else return father[u] = find(father[u]);
}

bool same(int u, int v) {
    u = find(u);
    v = find(v);
    if(u==v) return true;
    else return false;
}

void join(int u, int v) {
    u = find(u);
    v = find(v);
    if(u==v) return;
    else father[v] = u;
}

struct Edge{
    int s;
    int t;
    int v;
    Edge(){}
    Edge(int n1, int n2, int n3):s(n1),t(n2),v(n3){}
};

bool myCmp(Edge& e1, Edge& e2) {
    return e1.v<e2.v;
}

int main() {
    int n;
    while (cin >> n) { // 注意 while 处理多个 case
        if(n==0) break;
        init();
        int s,t,val,build;
        vector<Edge> edges;
        int cost = 0;
        int edge_cnt = 0;
        for(int i = 0; i<n*(n-1)/2; i++) {
            cin>>s >> t >> val >> build;
            if(build==1 && !same(s,t)) {
                edge_cnt++;
                join(s, t);
                // cost += val;
                continue;
            }
            edges.push_back(Edge(s,t,val));
        }
        sort(edges.begin(), edges.end(), myCmp);
        // for(int i = 0; i<edges.size(); i++)  {
        //     cout << ":: " << edges[i].s << "->" << edges[i].t << "(" << edges[i].v << ")" << endl;
        // }
        while(edge_cnt<n-1) {
            for(int i = 0; i<edges.size(); i++) {
                if(same(edges[i].s, edges[i].t)) continue;
                else {
                    cost+=edges[i].v;
                    join(edges[i].s, edges[i].t);
                    edge_cnt++;
                    break;
                }
            }
        }
        cout << cost << endl;
    }
}
// 64 位输出请用 printf("%lld")