Example #1
0
    public static void Main()
    {
        Console.SetOut(new StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        var n  = NextInt;
        var q  = NextInt;
        var uf = new PotentializedUnionFind <int>(n, (x, y) => x + y, x => - x, 0);

        for (int i = 0; i < q; i++)
        {
            if (NextInt == 0)
            {
                uf.TryUnite(NextInt, NextInt, NextInt);
            }
            else
            {
                var a = NextInt;
                var b = NextInt;
                Console.WriteLine(uf.Find(a) == uf.Find(b) ? uf.GetPotential(b, a).ToString() : "?");
            }
        }
        Console.Out.Flush();
    }
Example #2
0
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());

        int[][] matrix = Enumerable.Range(0, n).Select(h => Console.ReadLine().Select((x, w) => h == w ? 0 : x == '1' ? 1 : 1 << 29).ToArray()).ToArray();
        PotentializedUnionFind <bool> puf = new PotentializedUnionFind <bool>(n, (x, y) => x ^ y, x => x, false);

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (matrix[i][j] == 1 && !puf.TryUnite(i, j, true))
                {
                    Console.WriteLine(-1);
                    return;
                }
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                for (int k = 0; k < n; k++)
                {
                    matrix[j][k] = Min(matrix[j][k], matrix[j][i] + matrix[i][k]);
                }
            }
        }
        Console.WriteLine(matrix.Max(x => x.Max()) + 1);
    }