結果
| 問題 |
No.748 yuki国のお財布事情
|
| コンテスト | |
| ユーザー |
merom686
|
| 提出日時 | 2018-10-19 22:14:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 46 ms / 2,000 ms |
| コード長 | 1,348 bytes |
| コンパイル時間 | 847 ms |
| コンパイル使用メモリ | 83,312 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-18 21:01:51 |
| 合計ジャッジ時間 | 2,311 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
using ll = long long;
struct UnionFind {
UnionFind(int n) : p(n, -1) {}
int root(int u) {
return p[u] < 0 ? u : p[u] = root(p[u]);
}
bool same(int u, int v) {
return root(u) == root(v);
}
void unite(int u, int v) {
u = root(u);
v = root(v);
if (u == v) return;
if (p[u] > p[v]) swap(u, v);
p[u] += p[v];
p[v] = u;
}
vector<int> p;
};
struct Edge {
bool operator<(Edge o) { return c < o.c; }
int i, j;
int c;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
ll r = 0;
vector<Edge> e(m);
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
a--; b--;
e[i] = { a, b, c };
r += e[i].c;
}
UnionFind uf(n);
for (int j = 0; j < k; j++) {
int i;
cin >> i;
i--;
uf.unite(e[i].i, e[i].j);
r -= e[i].c;
}
sort(e.begin(), e.end());
for (int i = 0; i < m; i++) {
if (uf.same(e[i].i, e[i].j)) continue;
uf.unite(e[i].i, e[i].j);
r -= e[i].c;
}
cout << r << endl;
return 0;
}
merom686