回答編集履歴

2

再現方法の明示

2023/03/29 20:50

投稿

actorbug
actorbug

スコア2224

test CHANGED
@@ -2,6 +2,7 @@
2
2
  Pythonでは、再帰呼び出しの深さに上限があり、それを超えるとエラーになります。(公式の[sys.setrecursionlimit](https://docs.python.org/ja/3/library/sys.html#sys.setrecursionlimit)の説明を参照)
3
3
 
4
4
  UnionFind上で要素が一直線上に並ぶようにしたデータを渡せば、問題を再現できます。
5
+ ご提示のコードに、以下の修正を加えたうえで実行してみてください。
5
6
  ```python
6
7
  # n,m = map(int,input().split())
7
8
  n,m = 200000,199999
@@ -10,12 +11,20 @@
10
11
  v = [0]*m
11
12
  w = [0]*m
12
13
  for i in range(m):
13
- # v[i],w[i] = map(int,input().split())
14
+ # v[i],w[i] = map(int,input().split())
14
- # v[i] -= 1
15
+ # v[i] -= 1
15
- # w[i] -= 1
16
+ # w[i] -= 1
16
- # uf.union(v[i],w[i])
17
17
  v[i], w[i] = i, i+1
18
18
  uf.union(v[i],w[i])
19
19
  ```
20
+ もしくは、以下のようなデータを作成して実行してみてください。
21
+ ```
22
+ 200000 199999
23
+ 1 2
24
+ 2 3
25
+ ...
26
+ 199998 199999
27
+ 199999 200000
28
+ ```
20
29
 
21
30
  修正方法は、`UnionFind.union`にてサイズの大きい方を親とする修正を加えるか、`UnionFind.root`を再帰呼び出しを使わずに実装するか、でしょうか。(再帰呼び出しの最大回数が、プラットフォームが定める最大値を超えているので、sys.setrecursionlimitでは解決しません)

1

別の修正方法を追記

2023/03/28 21:41

投稿

actorbug
actorbug

スコア2224

test CHANGED
@@ -18,4 +18,4 @@
18
18
  uf.union(v[i],w[i])
19
19
  ```
20
20
 
21
- 修正するには、`UnionFind.root`を再帰呼び出しを使わずに実装するしかありません。(再帰呼び出しの最大回数が、プラットフォームが定める最大値を超えているので、sys.setrecursionlimitでは解決しません)
21
+ 修正方法は、`UnionFind.union`にてサイズの大きい方を親とする修正を加えるか、`UnionFind.root`を再帰呼び出しを使わずに実装するか、でょうか。(再帰呼び出しの最大回数が、プラットフォームが定める最大値を超えているので、sys.setrecursionlimitでは解決しません)