http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1163&lang=jp
2以上10000000未満の数値が書かれた青と赤のカードが複数与えられる。2以上の公約数を持つような赤と青のペアは最大でいくつ作れるか。
二部マッチング。アリ本p197をそのまま写しました。
入力が特殊な為、言語によっては注意が必要です。
enumerateがstartを指定できることを知った。幸せ。
20秒強掛かったので直すべき箇所があるかもしれません。
from fractions import gcd V = 1002 G = [] visited = [] match = [] def add_edge(u,v): G[u].append(v) G[v].append(u) def dfs(v): visited[v] = True for u in G[v]: w = match[u] if w < 0 or not visited[w] and dfs(w): match[v] = u match[u] = v return True def bipartite_matching(): global match,visited res = 0 match = [-1]*V for v in xrange(V): if match[v] < 0: visited = [False]*V if dfs(v): res += 1 return res while True: m,n = map(int,raw_input().split()) if (m,n) == (0,0): break V = m+n+2 G = [[] for _ in xrange(V)] visited = [True] * V data = [] while len(data) < n+m: data += map(int,raw_input().split()) for i,b in enumerate(data[:m]): for j,r in enumerate(data[m:],m): if gcd(b,r) != 1: add_edge(i,j) print bipartite_matching()
0 件のコメント:
コメントを投稿