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);
    }