結果
| 問題 | No.317 辺の追加 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-12-10 00:47:38 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,450 bytes |
| 記録 | |
| コンパイル時間 | 117 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 20,864 KB |
| 最終ジャッジ日時 | 2024-09-15 06:59:18 |
| 合計ジャッジ時間 | 4,057 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | TLE * 1 -- * 37 |
ソースコード
class DisjointSet(object):
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
self.num = n # number of disjoint sets
def union(self, x, y):
self._link(self.find_set(x), self.find_set(y))
def _link(self, x, y):
if x == y:
return
self.num -= 1
if self.rank[x] > self.rank[y]:
self.parent[y] = x
else:
self.parent[x] = y
if self.rank[x] == self.rank[y]:
self.rank[y] += 1
def find_set(self, x):
xp = self.parent[x]
if xp != x:
self.parent[x] = self.find_set(xp)
return self.parent[x]
def read_data():
N, M = map(int, input().split())
ds = DisjointSet(N)
for m in range(M):
u, v = map(int, input().split())
u -= 1
v -= 1
if u == v:
continue
ds.union(u, v)
return N, ds
def solve(N, ds):
counts = [0] * N
for i in range(N):
counts[ds.find_set(i)] += 1
counts.sort()
dp = [N + 1] * (N + 1)
dp[0] = 0
cum = 0
for c in counts:
if c == 0:
continue
for idx in range(cum, -1, -1):
if dp[idx + c] > dp[idx] + 1:
dp[idx + c] = dp[idx] + 1
cum += c
for d in dp[1:]:
if d == N + 1:
print(-1)
else:
print(d - 1)
N, ds = read_data()
solve(N, ds)