Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ ac-library-python is a Python port of [AtCoder Library (ACL)](https://atcoder.jp
#### Graph

+ [Disjoint Set Union (DSU)](https://github.com/atcoder/ac-library/blob/master/document_en/dsu.md)
+ maxflow
+ mincostflow
+ scc

### Work in progress
Expand All @@ -40,8 +42,6 @@ ac-library-python is a Python port of [AtCoder Library (ACL)](https://atcoder.jp

#### Graph

+ maxflow
+ mincostflow
+ twosat

## Install
Expand Down
4 changes: 2 additions & 2 deletions README_ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ ac-library-pythonは、[AtCoder Library (ACL)](https://atcoder.jp/posts/517)のP
#### グラフ

+ [Disjoint Set Union (DSU)](https://github.com/atcoder/ac-library/blob/master/document_ja/dsu.md)
+ maxflow
+ mincostflow
+ scc

### 準備中
Expand All @@ -38,8 +40,6 @@ ac-library-pythonは、[AtCoder Library (ACL)](https://atcoder.jp/posts/517)のP

#### グラフ

+ maxflow
+ mincostflow
+ twosat

## インストール
Expand Down
63 changes: 0 additions & 63 deletions atcoder/maxflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,66 +141,3 @@ def min_cut(self, s: int) -> List[bool]:
visited[e.dst] = True
stack.append(e.dst)
return visited


# https://atcoder.jp/contests/practice2/tasks/practice2_d
def main() -> None:
import sys
n, m = map(int, sys.stdin.readline().split())
s = n * m
t = s + 1
g = MFGraph(t + 1)
grid = [list(sys.stdin.readline().strip()) for _ in range(n)]

def enc(i: int, j: int) -> int:
return i * m + j

def dec(v: int) -> (int, int):
return v // m, v % m

for i in range(n):
for j in range(m):
if grid[i][j] == '#':
continue
if (i + j) % 2 == 0:
g.add_edge(s, enc(i, j), 1)
else:
g.add_edge(enc(i, j), t, 1)

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
for i in range(n):
for j in range(m):
if (i + j) % 2 == 1 or grid[i][j] == '#':
continue
for direction in range(4):
ii = i + dx[direction]
jj = j + dy[direction]
if 0 <= ii < n and 0 <= jj < m and grid[ii][jj] == '.':
g.add_edge(enc(i, j), enc(ii, jj), 1)

print(g.flow(s, t))
for e in g.edges():
if e.src == s or e.dst == t or e.flow == 0:
continue
(i, j) = dec(e.src)
(ii, jj) = dec(e.dst)
if i == ii + 1:
grid[ii][jj] = 'v'
grid[i][j] = '^'
elif j == jj + 1:
grid[ii][jj] = '>'
grid[i][j] = '<'
elif i == ii - 1:
grid[i][j] = 'v'
grid[ii][jj] = '^'
else:
grid[i][j] = '>'
grid[ii][jj] = '<'

for s in grid:
print("".join(s))


if __name__ == '__main__':
main()
34 changes: 0 additions & 34 deletions atcoder/mincostflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,37 +125,3 @@ def refine_dual() -> bool:
result.append((flow, cost))
prev_cost_per_flow = c
return result


# https://atcoder.jp/contests/practice2/tasks/practice2_e
def main() -> None:
import sys
n, k = map(int, sys.stdin.readline().split())
s = n * 2
t = s + 1
g = MCFGraph(t + 1)
grid = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
big = 10 ** 9
edges = list([] for _ in range(n))
for i in range(n):
g.add_edge(s, i, k, 0)
g.add_edge(i + n, t, k, 0)
for j in range(n):
edges[i].append(g.add_edge(i, j + n, 1, big - grid[i][j]))
g.add_edge(s, t, n * k, big)

cost = g.flow(s, t, n * k)[1]
print(big * n * k - cost)

result = list(['.'] * n for _ in range(n))
for i in range(n):
for j in range(n):
if g.get_edge(edges[i][j]).flow > 0:
result[i][j] = 'X'

for s in result:
print("".join(s))


if __name__ == '__main__':
main()
4 changes: 2 additions & 2 deletions example/dsu_practice.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# https://atcoder.jp/contests/practice2/tasks/practice2_a

import sys

from atcoder.dsu import DSU


def main() -> None:
import sys

n, q = map(int, sys.stdin.readline().split())
dsu = DSU(n)

Expand Down
4 changes: 2 additions & 2 deletions example/fenwick_practice.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# https://atcoder.jp/contests/practice2/tasks/practice2_b

import sys

from atcoder.fenwicktree import FenwickTree


def main() -> None:
import sys

n, q = map(int, sys.stdin.readline().split())
fenwick_tree = FenwickTree(n)

Expand Down
4 changes: 2 additions & 2 deletions example/floor_sum_practice.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# https://atcoder.jp/contests/practice2/tasks/practice2_c

import sys

from atcoder.math import floor_sum


def main() -> None:
import sys

t = int(sys.stdin.readline())
for _ in range(t):
n, m, a, b = map(int, sys.stdin.readline().split())
Expand Down
66 changes: 66 additions & 0 deletions example/maxflow_practice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# https://atcoder.jp/contests/practice2/tasks/practice2_d

import sys

from atcoder.maxflow import MFGraph


def main() -> None:
n, m = map(int, sys.stdin.readline().split())
s = n * m
t = s + 1
g = MFGraph(t + 1)
grid = [list(sys.stdin.readline().strip()) for _ in range(n)]

def enc(i: int, j: int) -> int:
return i * m + j

def dec(v: int) -> (int, int):
return v // m, v % m

for i in range(n):
for j in range(m):
if grid[i][j] == '#':
continue
if (i + j) % 2 == 0:
g.add_edge(s, enc(i, j), 1)
else:
g.add_edge(enc(i, j), t, 1)

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
for i in range(n):
for j in range(m):
if (i + j) % 2 == 1 or grid[i][j] == '#':
continue
for direction in range(4):
ii = i + dx[direction]
jj = j + dy[direction]
if 0 <= ii < n and 0 <= jj < m and grid[ii][jj] == '.':
g.add_edge(enc(i, j), enc(ii, jj), 1)

print(g.flow(s, t))
for e in g.edges():
if e.src == s or e.dst == t or e.flow == 0:
continue
(i, j) = dec(e.src)
(ii, jj) = dec(e.dst)
if i == ii + 1:
grid[ii][jj] = 'v'
grid[i][j] = '^'
elif j == jj + 1:
grid[ii][jj] = '>'
grid[i][j] = '<'
elif i == ii - 1:
grid[i][j] = 'v'
grid[ii][jj] = '^'
else:
grid[i][j] = '>'
grid[ii][jj] = '<'

for s in grid:
print("".join(s))


if __name__ == '__main__':
main()
37 changes: 37 additions & 0 deletions example/mincostflow_practice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# https://atcoder.jp/contests/practice2/tasks/practice2_e

import sys

from atcoder.mincostflow import MCFGraph


def main() -> None:
n, k = map(int, sys.stdin.readline().split())
s = n * 2
t = s + 1
g = MCFGraph(t + 1)
grid = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
big = 10 ** 9
edges = list([] for _ in range(n))
for i in range(n):
g.add_edge(s, i, k, 0)
g.add_edge(i + n, t, k, 0)
for j in range(n):
edges[i].append(g.add_edge(i, j + n, 1, big - grid[i][j]))
g.add_edge(s, t, n * k, big)

cost = g.flow(s, t, n * k)[1]
print(big * n * k - cost)

result = list(['.'] * n for _ in range(n))
for i in range(n):
for j in range(n):
if g.get_edge(edges[i][j]).flow > 0:
result[i][j] = 'X'

for s in result:
print("".join(s))


if __name__ == '__main__':
main()