結果
| 問題 |
No.1833 Subway Planning
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 15:50:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,724 bytes |
| コンパイル時間 | 233 ms |
| コンパイル使用メモリ | 82,776 KB |
| 実行使用メモリ | 426,960 KB |
| 最終ジャッジ日時 | 2025-06-12 15:50:27 |
| 合計ジャッジ時間 | 11,948 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | AC * 3 WA * 2 TLE * 1 -- * 17 |
ソースコード
import sys
from collections import deque, defaultdict
def main():
sys.setrecursionlimit(1 << 25)
N = int(sys.stdin.readline())
edges = []
edges_dict = {}
for _ in range(N-1):
u, v, c = map(int, sys.stdin.readline().split())
edges.append((u, v, c))
edges_dict[(u, v)] = c
edges_dict[(v, u)] = c
max_initial = max(c for u, v, c in edges)
low = 0
high = max_initial
def is_feasible(X):
E = []
nodes = set()
for u, v, c in edges:
if c > X:
E.append((u, v, c))
nodes.add(u)
nodes.add(v)
if not E:
return True
adj = defaultdict(list)
for u, v, c in E:
adj[u].append(v)
adj[v].append(u)
visited = set()
start = next(iter(nodes)) if nodes else None
if start is None:
return True
q = deque([start])
visited.add(start)
while q:
u = q.popleft()
for v in adj[u]:
if v not in visited:
visited.add(v)
q.append(v)
if len(visited) != len(nodes):
return False
degree = defaultdict(int)
for u in adj:
degree[u] = len(adj[u])
deg1 = 0
deg2 = 0
for u in nodes:
d = degree[u]
if d > 2:
return False
if d == 1:
deg1 += 1
elif d == 2:
deg2 += 1
if deg1 != 2:
return False
ends = [u for u in nodes if degree[u] == 1]
if len(ends) != 2:
return False
u, v = ends
parent = {}
c_list = []
visited_bfs = set([u])
q = deque([u])
parent[u] = None
while q:
current = q.popleft()
for neighbor in adj[current]:
if neighbor not in visited_bfs:
visited_bfs.add(neighbor)
parent[neighbor] = current
c = edges_dict[(current, neighbor)]
c_list.append(c)
q.append(neighbor)
if not c_list:
max_c = E[0][2]
min_c = E[0][2]
else:
max_c = max(c_list)
min_c = min(c_list)
if (max_c - min_c) <= X:
return True
else:
return False
answer = max_initial
while low <= high:
mid = (low + high) // 2
if is_feasible(mid):
answer = mid
high = mid - 1
else:
low = mid + 1
print(answer)
if __name__ == "__main__":
main()
gew1fw