最小全域木
問題
- struct edge { int u, v, cost; };
- //比較関数
- bool comp(const edge& e1, const edge&e2) {
- return e1.cost < e2.cost;
- }
- edge es[MAX];
- int V, E;
- int kruskal() {
- sort(es, es + E, comp);//costでソート
- init(V);
- int res = 0;
- //コストが小さい辺から順に追加する
- REP(i, E) {
- edge e = es[i];
- //もし閉路ができなければその辺を追加する
- if (!same(e.u, e.v)) {
- unite(e.u, e.v);
- res += e.cost;
- }
- }
- return res;
- }
- int main() {
- cin >> V >> E;
- REP(i, E) {
- int s, t, w;
- cin >> s >> t >> w;
- es[i] = { s,t,w };
- }
- int ans = kruskal();
- cout << ans << endl;
- }