結果
| 問題 |
No.2236 Lights Out On Simple Graph
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 19:00:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 3,098 ms / 4,000 ms |
| コード長 | 3,872 bytes |
| コンパイル時間 | 184 ms |
| コンパイル使用メモリ | 82,380 KB |
| 実行使用メモリ | 282,132 KB |
| 最終ジャッジ日時 | 2025-06-12 19:01:46 |
| 合計ジャッジ時間 | 79,371 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 57 |
ソースコード
import sys
from collections import deque
def main():
sys.setrecursionlimit(1 << 25)
N, M = map(int, sys.stdin.readline().split())
edges = []
for _ in range(M):
a, b = map(int, sys.stdin.readline().split())
edges.append((a-1, b-1)) # zero-based
c = list(map(int, sys.stdin.readline().split()))
# Function to find connected components
def find_components():
visited = [False] * N
components = []
for i in range(N):
if not visited[i]:
q = deque()
q.append(i)
visited[i] = True
component = []
while q:
u = q.popleft()
component.append(u)
for v in range(N):
if (u, v) in edge_set or (v, u) in edge_set:
if not visited[v]:
visited[v] = True
q.append(v)
components.append(component)
return components
edge_set = set(edges)
components = find_components()
total = 0
for comp in components:
k = len(comp)
# Create a mapping from vertex to index in the component
vertex_index = {u: i for i, u in enumerate(comp)}
# Extract edges in this component
edges_in_comp = []
for a, b in edges:
if a in comp and b in comp:
edges_in_comp.append((a, b))
m = len(edges_in_comp)
# Compute sum of c_v for the component
sum_c = sum(c[u] for u in comp)
if sum_c % 2 != 0:
print(-1)
return
# Now, split edges into two halves
if m == 0:
# No edges, so if sum_c is 0, nothing to do. Otherwise, impossible.
if sum(c[u] for u in comp) != 0:
print(-1)
return
continue
# Split into two halves
half = m // 2
A_edges = edges_in_comp[:half]
B_edges = edges_in_comp[half:]
# Precompute all subset vectors for A
A_size = len(A_edges)
A_vectors = {}
# Generate all subsets of A_edges
for mask in range(0, 1 << A_size):
bits = bin(mask).count('1')
vec = 0
for i in range(A_size):
if (mask >> i) & 1:
a, b = A_edges[i]
ai = vertex_index[a]
bi = vertex_index[b]
vec ^= (1 << ai) | (1 << bi)
if vec not in A_vectors or bits < A_vectors[vec]:
A_vectors[vec] = bits
# Precompute all subset vectors for B
B_size = len(B_edges)
B_vectors = {}
for mask in range(0, 1 << B_size):
bits = bin(mask).count('1')
vec = 0
for i in range(B_size):
if (mask >> i) & 1:
a, b = B_edges[i]
ai = vertex_index[a]
bi = vertex_index[b]
vec ^= (1 << ai) | (1 << bi)
if vec not in B_vectors or bits < B_vectors[vec]:
B_vectors[vec] = bits
# Now, compute the target vector
target = 0
for u in comp:
if c[u] == 1:
i = vertex_index[u]
target ^= (1 << i)
min_edges = float('inf')
# Try all possible vectors from A
for vec_A in A_vectors:
need = target ^ vec_A
if need in B_vectors:
total_edges = A_vectors[vec_A] + B_vectors[need]
if total_edges < min_edges:
min_edges = total_edges
if min_edges == float('inf'):
print(-1)
return
total += min_edges
print(total)
if __name__ == '__main__':
main()
gew1fw