結果
問題 | No.748 yuki国のお財布事情 |
ユーザー |
![]() |
提出日時 | 2019-11-02 22:25:34 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 138 ms / 2,000 ms |
コード長 | 1,511 bytes |
コンパイル時間 | 1,963 ms |
コンパイル使用メモリ | 175,376 KB |
実行使用メモリ | 7,000 KB |
最終ジャッジ日時 | 2024-09-14 23:24:06 |
合計ジャッジ時間 | 4,574 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i = 0; i < (n);i++) #define sz(x) int(x.size()) typedef long long ll; typedef pair<int,int> P; struct UnionFind{ vector<int> data; /* UnionFind(int sz) { data.assign(sz, -1); }*/ void make(int sz) { data.assign(sz, -1); } bool unite(int x, int y) { x = find(x), y = find(y); if(x == y) return (false); if(data[x] > data[y]) swap(x, y);//親は負でサイズを保存 data[x] += data[y]; data[y] = x; return (true); } int find(int k) { if(data[k] < 0) return (k); return (data[k] = find(data[k])); } bool same(int x, int y){ return find(x) == find(y); } int size(int k) { return (-data[find(k)]); } }; struct Edge{ll u,v; int cost;}; using Edges = vector<Edge>; int n, m, k; UnionFind uf; bool comp(const Edge &a, const Edge &b){ return a.cost < b.cost; } ll res; void kruskal(Edges &es){ sort(es.begin(),es.end(),comp); for(auto e : es){ ll cost = e.cost; int u = e.u,v = e.v; if(!uf.same(u,v)){ uf.unite(u,v); res += cost; } } } int main(){ cin >> n >> m >> k; Edges es; uf.make(n); ll max_cost = 0; rep(i,m) { Edge e; cin >> e.u >> e.v >> e.cost; e.u--; e.v--; max_cost += e.cost; es.push_back(e); } rep(i,k) { int t; cin >> t; t--; uf.unite(es[t].u, es[t].v); res += es[t].cost; } kruskal(es); cout << max_cost - res << endl; return 0; }