[ABC218] E - Destruction

[Q] https://atcoder.jp/contests/abc218/tasks/abc218_e

UnionFind。
1, 価値が低いものからuniteする。
2. 連結確認ができたら、以降は得点の加算。
=> 2頂点がすでにissameなら加算、かも。(2WA)
※負の辺は切らなくてもいいからマイナスしなくてもいい。

似たような問題が最近のABCであったと思う。(さがしちゅう)
これだ
D - Sum of Maximum Weights
https://atcoder.jp/contests/abc214/tasks/abc214_d
まったく同じ解法。得点の低いものからuniteしていく。

Q. 200010?
A. 辺の数がN(N-1)なので、160000くらいまで入りうる(2RE)

ll A[200010];
ll B[200010];
int main(){
 ll N, M;
 cin >> N >> M;
 vector<pll> C(M);
 rep(i, M){
   ll a, b, c;
   cin >> a >> b >> c;
   --a, --b;
   A[i] = a;
   B[i] = b;
   C[i] = {c, i};
 }
 sort(all(C)); // 価値でソート
 UnionFind tree(N);
 bool fin = false;
 ll ans = 0;
 rep(i, M){
   ll id = C[i].second;
   ll c = C[i].first;
   if (fin){
     ans += max(0LL, c);
     continue;
   }

   ll a = A[id];
   ll b = B[id];
   if (tree.issame(a, b)){ // 連結しても要素が変わらないなら加算対象。
     ans += max(0LL, c);
   }
   else tree.unite(a, b);
   if (tree.size(0) == N) fin = true; // 連結したらfinフラグ
 }
 cout << ans << endl;
}

https://atcoder.jp/contests/abc218/submissions/25791244

この記事が気に入ったらサポートをしてみませんか?