結果
問題 | No.483 マッチ並べ |
ユーザー |
👑 |
提出日時 | 2022-11-08 17:34:45 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 56 ms / 2,000 ms |
コード長 | 2,604 bytes |
コンパイル時間 | 323 ms |
コンパイル使用メモリ | 82,428 KB |
実行使用メモリ | 68,776 KB |
最終ジャッジ日時 | 2024-07-22 01:46:20 |
合計ジャッジ時間 | 4,410 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 53 |
ソースコード
def scc(N, G):order = []used = [False]*Ngroup = [None]*NRG = [[] for _ in range(N)]for i in range(N):for j in G[i]:RG[j].append(i)def dfs(pos):stack = [(1, pos), (0, pos)]while stack:t, pos = stack.pop()if t == 0:if used[pos]:stack.pop()continueused[pos] = Truefor npos in G[pos]:if not used[npos]:stack.append((1, npos))stack.append((0, npos))else:order.append(pos)def rdfs(pos, col):stack = [pos]group[pos] = colused[pos] = Truewhile stack:pos = stack.pop()for npos in RG[pos]:if not used[npos]:used[npos] = Truegroup[npos] = colstack.append(npos)for i in range(N):if not used[i]:dfs(i)used = [False]*Nlabel = 0for s in reversed(order):if not used[s]:rdfs(s, label)label += 1return label, groupclass Two_SAT:def __init__(self, n):self.n = nself.G = [[] for _ in range(2 * n)]# a V B# pos_i = True -> a = i# pos_i = False -> a = ¬idef add_edge(self, i, pos_i, j, pos_j):i0 = ii1 = i + self.nif not pos_i:i0, i1 = i1, i0j0 = jj1 = j + self.nif not pos_j:j0, j1 = j1, j0self.G[i1].append(j0)self.G[j1].append(i0)def const(self):_, self.group = scc(2 * self.n, self.G)def check(self):for i in range(self.n):if self.group[i] == self.group[i + self.n]:return Falsereturn Truedef assign(self):ret = [False] * self.nfor i in range(self.n):if self.group[i] > self.group[i + self.n]:ret[i] = Truereturn retn = int(input())RC = [list(map(int, input().split())) for _ in range(n)]TS = Two_SAT(n)for i in range(n):r0, c0, r1, c1 = RC[i]for j in range(i + 1, n):r2, c2, r3, c3 = RC[j]for ii, p0 in enumerate([(r0, c0), (r1, c1)]):for jj, p1 in enumerate([(r2, c2), (r3, c3)]):if p0 == p1:TS.add_edge(i, ii, j, jj)TS.const()if TS.check():print("YES")else:print("NO")