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());
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
File: 1.cs Progetto: qifanyyy/CLCDSA
        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)));
            }
        }
Esempio n. 5
0
    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}'");
        }
    }
Esempio n. 6
0
    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);
    }
Esempio n. 7
0
    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));
        }
    }