Esempio n. 1
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. 2
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. 3
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));
        }
    }