結果
問題 | No.748 yuki国のお財布事情 |
ユーザー |
|
提出日時 | 2020-06-27 10:50:25 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 124 ms / 2,000 ms |
コード長 | 2,607 bytes |
コンパイル時間 | 1,126 ms |
コンパイル使用メモリ | 105,604 KB |
実行使用メモリ | 11,168 KB |
最終ジャッジ日時 | 2024-07-05 08:59:21 |
合計ジャッジ時間 | 4,247 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
//#include <bits/stdc++.h>#include <iostream>#include <algorithm>#include <vector>#include <string>#include <cstring>#include <complex>#include <stack>#include <queue>#include <unordered_map>#include <map>using namespace std;struct UnionFind{vector<long long int> par; //par[i] : iの親の番号vector<long long int> rnk; //root[i] : iの木のランク//コンストラクタUnionFind(long long int n): par(n), rnk(n){//木の初期化for(long long int i = 0; i < n; i++){par[i] = i;rnk[i] = 1;}}//データxが属する木の根を再帰で取得long long int root(long long int x){if(par[x] == x){return x;}else{return par[x] = root(par[x]);}}//xとyが同じ木に属しているかを判定bool same(long long int x, long long int y){return root(x) == root(y);}//xとyの木を併合void unite(long long int x, long long int y){long long int rx = root(x); //xの根long long int ry = root(y); //yの根if(rx == ry) return; //根が同じならそのままif(rnk[rx] < rnk[ry]){par[rx] = ry;}else{par[ry] =rx;if(rnk[rx] == rnk[ry]) rnk[rx]++;}}};int main(){long long i, j, n, m, k, from, to, cost, a1, a2, a3;cin >> n >> m >> k;UnionFind uf(n);vector<pair<long long, pair<long long , long long> > > tmp_p(m);vector<pair<long long, pair<long long , long long> > > p(0);long long used[m];long long sumcost = 0;long long ans = 0;for(i=0;i<m;i++) used[i] = 0;for(i=0;i<m;i++) {cin >> from >> to >> cost;tmp_p[i] = make_pair(cost, make_pair(from-1, to-1));sumcost += cost;}for(i=0;i<k;i++) {cin >> a1;//cout << a1 << endl;used[a1-1] = 1;}for(i=0;i<m;i++) {//scout << used[i] << endl;if(used[i]) {uf.unite(tmp_p[i].second.first, tmp_p[i].second.second);ans += tmp_p[i].first;} else {p.push_back(tmp_p[i]);}}sort(p.begin(), p.end());for(i=0;i<p.size();i++){//cost = first//from = second.fist//to = second.secondif(!uf.same(p[i].second.first, p[i].second.second)){uf.unite(p[i].second.first, p[i].second.second);ans += p[i].first;}}/*cout << sumcost << endl;cout << ans << endl;*/cout << sumcost-ans << endl;}