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