結果
| 問題 |
No.1023 Cyclic Tour
|
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2021-04-09 13:20:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 364 ms / 2,000 ms |
| コード長 | 2,664 bytes |
| コンパイル時間 | 347 ms |
| コンパイル使用メモリ | 82,560 KB |
| 実行使用メモリ | 128,256 KB |
| 最終ジャッジ日時 | 2024-06-24 20:36:59 |
| 合計ジャッジ時間 | 18,850 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 49 |
ソースコード
import sys
sys.setrecursionlimit(10**6)
int1 = lambda x: int(x)-1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.buffer.readline())
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def LI1(): return list(map(int1, sys.stdin.buffer.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def LLI1(rows_number): return [LI1() for _ in range(rows_number)]
def BI(): return sys.stdin.buffer.readline().rstrip()
def SI(): return sys.stdin.buffer.readline().rstrip().decode()
# dij = [(0, 1), (-1, 0), (0, -1), (1, 0)]
# dij = [(0, 1), (-1, 0), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]
dij = [(0, 1), (1, 0), (1, 1), (1, -1)]
inf = 10**19
# md = 998244353
md = 10**9+7
class UnionFind:
def __init__(self, n):
self.state = [-1]*n
self.size_table = [1]*n
# cntはグループ数
self.cnt = n
def root(self, u):
v = self.state[u]
if v < 0: return u
self.state[u] = res = self.root(v)
return res
def merge(self, u, v):
ru = self.root(u)
rv = self.root(v)
if ru == rv: return
du = self.state[ru]
dv = self.state[rv]
if du > dv: ru, rv = rv, ru
if du == dv: self.state[ru] -= 1
self.state[rv] = ru
self.cnt -= 1
self.size_table[ru] += self.size_table[rv]
return
# グループの要素数
def size(self, u):
return self.size_table[self.root(u)]
from collections import defaultdict
n, m = LI()
uf = UnionFind(n)
to = [[] for _ in range(n)]
deg = [0]*n
for _ in range(m):
u, v, c = LI1()
if c:
to[u].append(v)
else:
uf.merge(u, v)
deg[u] += 1
deg[v] += 1
rtou = defaultdict(list)
for u in range(n):
r = uf.root(u)
rtou[r].append(u)
gtou = list(rtou.values())
utog = [0]*n
for g, uu in enumerate(gtou):
e = 0
for u in uu:
utog[u] = g
e += deg[u]
if e//2 > len(uu)-1:
print("Yes")
exit()
gn = len(gtou)
to2 = [set() for _ in range(gn)]
for u in range(n):
g = utog[u]
for v in to[u]:
to2[g].add(utog[v])
def dfs(g):
stack = [g]
while stack:
g = stack.pop()
if fin[g] == -1:
fin[g] = 0
stack.append(g)
for v in to2[g]:
if fin[v] == -1:
stack.append(v)
elif fin[v] == 0:
return True
elif fin[g] == 0:
fin[g] = 1
return False
fin = [-1]*gn
for g in range(gn):
if fin[g] == -1 and dfs(g):
print("Yes")
exit()
print("No")
mkawa2