public void Ordinal() { var bm = new BipartiteMatching(); bm.AddPair(0, 3); bm.AddPair(0, 4); bm.AddPair(1, 3); bm.AddPair(1, 5); bm.AddPair(2, 4); Assert.AreEqual(3, bm.GetMaxMatchingNum()); bm = new BipartiteMatching(); bm.AddPair(0, 4); bm.AddPair(1, 3); bm.AddPair(1, 5); bm.AddPair(2, 4); Assert.AreEqual(2, bm.GetMaxMatchingNum()); bm = new BipartiteMatching(); bm.AddPair(0, 4); bm.AddPair(0, 5); bm.AddPair(1, 4); bm.AddPair(1, 6); bm.AddPair(2, 5); bm.AddPair(2, 6); Assert.AreEqual(3, bm.GetMaxMatchingNum()); }
public void TestGraph2() { IGraph <int> graph = LoadGraph("Matching2_100_100"); (HashSet <IVertex <int> > set1, HashSet <IVertex <int> > set2) = SplitGraphVerteces(graph, 100); IEnumerable <IEdge <int> > matching = BipartiteMatching.FindMaxMatching(graph, set1, set2, graph.VertexCount, graph.VertexCount + 1); Assert.AreEqual(99, matching.Count()); }
static void Main() { var h = Read(); int nx = h[0], ny = h[1]; var es = Array.ConvertAll(new bool[h[2]], _ => Read()); var bm = new BipartiteMatching(nx, ny); bm.AddEdges(es); var r = bm.Dinic(); Console.WriteLine(r.Length); }
private static void Main(string[] args) { int tst = Console.ReadLine().ToInt(); for (int cas = 1; cas < tst + 1; cas++) { int[] ar = Console.ReadLine().ToIntArray(); int N = ar[0]; int M = ar[1]; int[,] input = new int[N, M]; for (int i = 0; i < N; i++) { int[] a = Console.ReadLine().ToIntArray(); for (int j = 0; j < M; j++) { input[i, j] = a[j]; } } bool[,] edge = new bool[N, N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) { continue; } bool flag = true; for (int k = 0; k < M; k++) { if (input[i, k] >= input[j, k]) { flag = false; break; } } if (flag) { edge[i, j] = true; } } } Console.WriteLine("Case #" + cas + ": " + (N - BipartiteMatching.Calc(edge))); } }
private static void Main(string[] args) { var bmi = new BipartiteMatching <int, char>(GenerateGraph(args)); var res = new HashDictionary <int, char>(); foreach (var rec in bmi.Result) { res.Add(rec.Item1, rec.Item2); } for (var i = 0; i < args.Length; i++) { var j = i; if (!res.Find(ref j, out char c)) { c = '-'; } Console.WriteLine($@"""{args[i]}"" -> '{c}'"); } }
static void Main() { var(h, w) = Read2(); var a = Array.ConvertAll(new bool[h], _ => Read()); var amax = 500000; var d = new List <int[]> [amax + 1]; var dr = new Dictionary <int, int> [amax + 1]; var dc = new Dictionary <int, int> [amax + 1]; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { var k = a[i][j]; if (k == 0) { continue; } if (d[k] == null) { d[k] = new List <int[]>(); dr[k] = new Dictionary <int, int>(); dc[k] = new Dictionary <int, int>(); } if (!dr[k].ContainsKey(i)) { dr[k][i] = dr[k].Count; } if (!dc[k].ContainsKey(j)) { dc[k][j] = dc[k].Count; } d[k].Add(new[] { dr[k][i], dc[k][j] }); } } var r = 0L; for (int k = 0; k <= amax; k++) { if (d[k] == null) { continue; } if (d[k].Count == 1) { r++; continue; } var bm = new BipartiteMatching(dr[k].Count, dc[k].Count); bm.AddEdges(d[k].ToArray()); var res = bm.Dinic(); r += res.Length; } Console.WriteLine(r); }
static void Main() { var(n, m) = Read2(); var s = Array.ConvertAll(new bool[n], _ => Console.ReadLine().ToCharArray()); var vs0 = new List <int>(); var vs1 = new List <int>(); var vs1Inv = Array.ConvertAll(new bool[n * m], _ => - 1); // checker board for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (s[i][j] == '#') { continue; } var v = m * i + j; if ((i + j) % 2 == 0) { vs0.Add(v); } else { vs1Inv[v] = vs1.Count; vs1.Add(v); } } } var bm = new BipartiteMatching(vs0.Count, vs1.Count); for (int i = 0; i < vs0.Count; i++) { var v = vs0[i]; if (v - m >= 0 && vs1Inv[v - m] != -1) { bm.AddEdge(i, vs1Inv[v - m]); } if (v + m < n * m && vs1Inv[v + m] != -1) { bm.AddEdge(i, vs1Inv[v + m]); } if (v % m != 0 && vs1Inv[v - 1] != -1) { bm.AddEdge(i, vs1Inv[v - 1]); } if (v % m != m - 1 && vs1Inv[v + 1] != -1) { bm.AddEdge(i, vs1Inv[v + 1]); } } var res = bm.Dinic(); foreach (var e in res) { var v0 = vs0[e[0]]; var v1 = vs1[e[1]]; var(i0, j0) = (v0 / m, v0 % m); var(i1, j1) = (v1 / m, v1 % m); if (i0 == i1) { s[i0][Math.Min(j0, j1)] = '>'; s[i0][Math.Max(j0, j1)] = '<'; } else { s[Math.Min(i0, i1)][j0] = 'v'; s[Math.Max(i0, i1)][j0] = '^'; } } Console.WriteLine(res.Length); foreach (var r in s) { Console.WriteLine(new string(r)); } }