結果
問題 |
No.1479 Matrix Eraser
|
ユーザー |
|
提出日時 | 2021-04-28 16:06:48 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 2,998 ms / 3,000 ms |
コード長 | 2,299 bytes |
コンパイル時間 | 4,288 ms |
コンパイル使用メモリ | 80,432 KB |
実行使用メモリ | 282,408 KB |
最終ジャッジ日時 | 2024-07-07 13:58:21 |
合計ジャッジ時間 | 71,399 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 39 |
ソースコード
import java.util.Scanner; import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; public class No1479 { private static class Values { public Set<Integer> u, v; public List<Integer[]> pos; public Values() { u = new HashSet<Integer>(); v = new HashSet<Integer>(); pos = new ArrayList<Integer[]>(); } } private static List<Set<Integer>> edges; private static int[] matched; private static boolean dfs(int v, Set<Integer> visited) { for (int u : edges.get(v)) { if (visited.contains(u)) { continue; } visited.add(u); if (matched[u] == -1 || dfs(matched[u], visited)) { matched[u] = v; return true; } } return false; } private static int mpc(int xn, int yn) { matched = new int[yn]; Arrays.fill(matched, -1); int left = xn, right = 0; List<Integer> ledges = new ArrayList<Integer>(); for (int v = 0; v < xn ; v++) { if (!dfs(v, new HashSet<Integer>())) { left--; ledges.add(v); } } for (int v : ledges) { for (int u : edges.get(v)) { right++; if (matched[u] >= 0) { left--; } } } return left + right; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int H = scan.nextInt(); int W = scan.nextInt(); HashMap<Integer, Values> S = new HashMap<Integer, Values>(); for (int i=0; i < H; i++) { for (int j = 0; j < W; j++) { int a = scan.nextInt(); if (a == 0) { continue; } if (S.containsKey(a)) { Values v = S.get(a); v.u.add(i); v.v.add(j); v.pos.add(new Integer[] {i, j}); } else { Values v = new Values(); v.u.add(i); v.v.add(j); v.pos.add(new Integer[] {i, j}); S.put(a, v); } } } scan.close(); int cnt = 0; for (Values v : S.values()) { List<Integer> hl = new ArrayList<Integer>(v.u); List<Integer> wl = new ArrayList<Integer>(v.v); int h = hl.size(); int w = wl.size(); edges = new ArrayList<Set<Integer>>(); for (int i = 0; i < h; i++) { edges.add(new HashSet<Integer>()); } for (Integer[] i : v.pos) { edges.get(hl.indexOf(i[0])).add(wl.indexOf(i[1])); } cnt += mpc(h, w); } System.out.println(cnt); } }