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