前提・実現したいこと
UnionFind木を構築したのですが、参照渡しがうまくいっていないのか関数の外の配列の値が更新されていません。
テストケースでは頂点数をn、辺の数をkとして、k組の頂点対を与えることを想定しています。
UnionFindの実行後のtree1の値は任意の連結頂点間で等しい値であり、任意の非連結頂点間で異なる値になるはずなのですが、初期化したtree1[i] = iの値のままでした。
### 想定される実行結果
入力
5 3
0 2
1 4
2 4
出力
0 0 0 3 0
該当のソースコード
C++
1#include "bits/stdc++.h" 2using namespace std; 3 4int root(vector<int>& tree, vector<int>& child, int i){ 5 if(i == tree[i]){ 6 for(int j = 0; j < child.size(); j++){ 7 tree[child[j]] = i; 8 child.clear(); 9 return i; 10 } 11 } 12 else{ 13 child.push_back(i); 14 return i = root(tree,child,tree[i]); 15 } 16} 17 18int unit(vector<int>& tree, vector<int>& child, int x,int y){ 19 x = root(tree,child,x); 20 y = root(tree,child,y); 21 tree[max(x,y)] = min(x,y); 22} 23 24bool isUnit(vector<int>& tree, vector<int>& child, int x,int y){ 25 return root(tree,child,x) == root(tree,child,y); 26} 27 28signed main(){ 29 ios::sync_with_stdio(false); 30 cin.tie(0); 31 32 int n,k; 33 cin >> n >> k; 34 35 vector<int> tree1(n),child1; 36 for(int i = 0, i < n; i++) tree1[i] = i; // 初期化 37 38 for(int i = 0; i < k; i++){ 39 int x,y; 40 cin >> x >> y; 41 unit(tree1,child1,x,y); 42 } 43 44 for(int i = 0; i < n; i++) cout << tree[i] << " "; 45 46}
マクロが多くて読みづらいです。C++ でマクロは極力使わないほうがよいです。
競技プログラミングで使用しているコードなのでマクロを使用する前提となっています。実務で使う場合には可読性を重視するつもりです。
>#define int long long・・・intは予約語ですが?まぁ、マクロだからいいっちゃいいんですが・・・
競技プログラミングでは条件によって32bitに収まらない値を扱うので、オーバーフローの対策としてintをlong longにしています。その関係でint main()がlong long main()となってしまいエラーが発生するので、signed main()に置き換えてあります。
回答2件
あなたの回答
tips
プレビュー