Maximum-Cup 2018 C - 嘘つきな天使たち
https://atcoder.jp/contests/maximum-cup-2018/tasks/maximum_cup_2018_c
提出
code: python
n = int(input())
a = int(input()) for _ in range(n)
graph = [[] for _ in range(n)]
for idx, g in enumerate(a):
g -= 1
graphidx.append(g)
graphg.append(idx)
colors = 0 for i in range(n)
# 頂点vをcolor(1 or -1)で塗り、再帰的に矛盾がないか調べる。矛盾があればFalse
def dfs(v,color):
# 今いる点を着色
colorsv = color
#今の頂点から行けるところをチェック
for to in graphv:
#同じ色が隣接してしまったらFalse
if colorsto == color:
return False
#未着色の頂点があったら反転した色を指定し、再帰的に調べる
if colorsto == 0 and not dfs(to, -color):
return False
# 調べ終わったら矛盾がないのでTrue
return True
# 2部グラフならTrue, そうでなければFalse
def is_bipartite():
return dfs(0,1) # 頂点0を黒(1)で塗ってDFS開始
print(n//2) if is_bipartite() else print(-1)
解答
code: python
from collections import defaultdict
n = int(input())
a = int(input()) for _ in range(n)
d = defaultdict(list)
# 天使に隣接しているのは悪魔、悪魔に隣接しているのは天使になる
for idx, v in enumerate(a):
didx+1.append(v)
dv.append(idx+1)
colors = 0 for _ in range(n+1)
def dfs(v, color):
colorsv = color
# 塗った時の数を記録
countcolor += 1
for to in dv:
if colorsto == color:
return False
if colorsto == 0 and not dfs(to, -color):
return False
return True
ans = 0
count = defaultdict(int)
for i in range(1, n+1):
if colorsi == 0: # 隣り合う頂点を違う色で塗り分けられればいい
if not dfs(i, 1): # 二部グラフではない
print(-1)
exit()
print(max(count.values()))
テーマ
#graph
蟻本 2-5 二部グラフ判定
メモ
Maximum-Cup 2018 C 嘘つきな天使たち
Maximum-Cup 2018 C
提出
code: python
from collections import defaultdict
n = int(input())
a = int(input()) for _ in range(n)
d = defaultdict(list)
for idx, v in enumerate(a):
didx+1.append(v)
# print(d)
# defaultdict(<class 'list'>, {1: 2, 2: 3, 3: 4, 4: 1})
# defaultdict(<class 'list'>, {1: 2, 2: 3, 3: 1})
# 閉路
visited = False * (n+1)