=== Normalisation checks (trivial instances) ===
one arc r->v, r_1=r_2=r, U_1=U_2={r,v}:            PC False  ARB False  LOC False
two parallel arcs r->v, same roots and sets:        PC True  ARB True  LOC True
r_1->r_2->v, U_1={r_1,r_2,v}, U_2={r_2,v}:           PC False  ARB False  LOC False
the same with the extra arc r_1->v:                 PC True  ARB True  LOC True
r_1->x<-r_2, x->v, U_1={r_1,x,v}, U_2={r_2,x,v}:     PC False  ARB False  LOC False

=== Worked example ===
vertices 0..9, arcs [(0, 3), (0, 4), (0, 5), (1, 3), (1, 5), (1, 6), (2, 3), (2, 4), (3, 4), (3, 6), (3, 7), (3, 8), (4, 5), (4, 7), (4, 8), (5, 6), (5, 7), (6, 8), (6, 9), (7, 9), (8, 9)]
roots r_1, r_2, r_3 = [0, 1, 2] ; U_i = {r_i} + {3,...,9}
sets convex: [True, True, True]
(PC) by max-flow: True ; (PC) by path enumeration: True ; (LOC): True
in-neighbours: {3: [0, 1, 2], 4: [0, 2, 3], 5: [0, 1, 4], 6: [1, 3, 5], 7: [3, 4, 5], 8: [3, 4, 6], 9: [6, 7, 8]}
families of independent arborescences on all 10 vertices: 24
families on the vertices 0..8: 15 ; of these 3 cannot be extended to vertex 9 (a greedy choice can get stuck):
   root paths to 6, 7, 8 in F_1 | F_2 | F_3: 6: [0, 3, 6] | [1, 6] | [2, 4, 5, 6] ; 7: [0, 3, 7] | [1, 5, 7] | [2, 4, 7] ; 8: [0, 4, 8] | [1, 6, 8] | [2, 3, 8]
   root paths to 6, 7, 8 in F_1 | F_2 | F_3: 6: [0, 5, 6] | [1, 6] | [2, 3, 6] ; 7: [0, 4, 7] | [1, 5, 7] | [2, 3, 7] ; 8: [0, 3, 8] | [1, 6, 8] | [2, 4, 8]
   root paths to 6, 7, 8 in F_1 | F_2 | F_3: 6: [0, 5, 6] | [1, 6] | [2, 3, 6] ; 7: [0, 4, 7] | [1, 5, 7] | [2, 3, 7] ; 8: [0, 5, 6, 8] | [1, 3, 8] | [2, 4, 8]

certificate (indices 1,2,3 of RESULT.md are 0,1,2 here):
  v : parent in F_1, F_2, F_3 : potential (f_1, f_2, f_3)
  3 : 0, 1, 2 : (0, 0, 0)
  4 : 0, 3, 2 : (0, 1, -2)
  5 : 0, 1, 4 : (-2, 1, 0)
  6 : 5, 1, 3 : (0, -2, 1)
  7 : 5, 3, 4 : (-1, 1, 0)
  8 : 3, 6, 4 : (1, 0, 0)
  9 : 7, 6, 8 : (0, -1, 0)
admissible (A1)-(A3) at every vertex: True
inequality (P) at every vertex: True
independent arborescences (verifier working with explicit paths): True
  vertex 3: admissible assignments (cost, tails for F_1,F_2,F_3): [(0, (0, 1, 2))]
  vertex 4: admissible assignments (cost, tails for F_1,F_2,F_3): [(0, (0, 3, 2))]
  vertex 5: admissible assignments (cost, tails for F_1,F_2,F_3): [(-2, (0, 1, 4))]
  vertex 6: admissible assignments (cost, tails for F_1,F_2,F_3): [(-2, (5, 1, 3)), (0, (3, 1, 5))]
  vertex 7: admissible assignments (cost, tails for F_1,F_2,F_3): [(-4, (5, 3, 4)), (-1, (3, 5, 4)), (-1, (5, 4, 3)), (0, (4, 3, 5)), (1, (3, 4, 5)), (1, (4, 5, 3))]
  vertex 8: admissible assignments (cost, tails for F_1,F_2,F_3): [(-4, (3, 6, 4)), (-2, (4, 6, 3)), (-2, (6, 3, 4)), (1, (4, 3, 6)), (1, (6, 4, 3)), (2, (3, 4, 6))]
  vertex 9: admissible assignments (cost, tails for F_1,F_2,F_3): [(-3, (7, 6, 8)), (-1, (8, 6, 7)), (0, (6, 8, 7)), (0, (7, 8, 6)), (1, (6, 7, 8)), (3, (8, 7, 6))]
chosen assignment = unique minimum-cost admissible assignment at every vertex: True
root paths to 9: [[0, 5, 7, 9], [1, 6, 9], [2, 4, 8, 9]]
