DSL_1_Aで以下の以下のコードを提出したところREになっていまいます。入力例でデバッグしてみたところ、com=0, x=1, y=3のクエリでfindSet(1)の戻り値がとても大きな値として、linkメッソドの第一引数に入ってしまうため、インデックスが配列の境界外となり、ランタイムエラーが発生しています。findSetメッソドをコメントアウト部分のように書き換えればREは生じなくなり、Acceptされますが、両者の違いが判りません。以下の提出コードでfindSet(1)の戻り値が記憶されない理由を教えていただきたいです。
C++
1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4 5class DisjointSet 6{ 7private: 8 vector<int> rank, p; 9 10public: 11 DisjointSet() {} 12 DisjointSet(int size) 13 { 14 rank.resize(size, 0); 15 p.resize(size, 0); 16 for (int i = 0; i < size; i++) makeSet(i); 17 } 18 19 void makeSet(int x) 20 { 21 p[x] = x; 22 rank[x] = 0; 23 } 24 25 bool same(int x, int y) 26 { 27 return findSet(x) == findSet(y); 28 } 29 30 void unite(int x, int y) 31 { 32 link(findSet(x), findSet(y)); 33 } 34 35 void link(int x, int y) 36 { 37 if (rank[y] < rank[x]) p[y] = x; 38 else { 39 p[x] = y; 40 if (rank[y] == rank[x]) rank[y]++; 41 } 42 } 43 44 int findSet(int x) 45 { 46 if (p[x] == x) return p[x]; 47 p[x] = findSet(p[x]); 48 /*if (p[x] != x) p[x] = findSet(p[x]); 49 return p[x];*/ 50 } 51}; 52 53int main() 54{ 55 int n, q; 56 cin >> n >> q; 57 DisjointSet ds(n); 58 for (int i = 0; i < q; i++) { 59 int com, x, y; 60 cin >> com >> x >> y; 61 if (com == 0) ds.unite(x, y); 62 else { 63 if (ds.same(x, y)) cout << 1 << endl; 64 else cout << 0 << endl; 65 } 66 } 67}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/09 07:33