OFFSET
0,3
COMMENTS
The sequence is the number of unique arrangements of directed graphs connecting 2*n vertices, where vertices occur in pairs, and meeting the following requirements:
1. Each vertex has an out-degree and in-degree of 1.
2. No edge connects vertices that are paired.
3. Starting with any pair, following the edges of paired vertices connects all vertices.
4. There are no closed walks of two vertices (i.e., no reciprocal connections).
The requirements were chosen to yield a nice gift exchange between a set of couples. Acknowledgement to the additional members of the initial, inspirational gift exchange group: Cat, Brad, Kim, Ada, Graham, Nolan, and Leah.
The fraction of graphs meeting the requirements is approximately 0.07. Starting with n=2, the fractions are (0.083333333, 0.066666667, 0.06547619, 0.068994709, 0.071212121, 0.072810787). Is there a way to compute the percentage of graphs satisfying the condition in the limit as n approaches infinity?
EXAMPLE
For n = 0, there are no pairs; a(0) = 0 since no edges exist.
For n = 1, there is one pair; a(1) = 0 since requirements 1 and 2 can't be satisfied.
For n = 2, there are two pairs; a(2) = 2 graphs given by these edge destinations:
((2, 3), (1, 0))
((3, 2), (0, 1))
while ((2, 3), (0, 1)) is not allowed because the first and third edges form a 2-vertex walk.
PROG
(Python)
from itertools import permutations as perm
def num_connected_by_pairs(assigned, here=0, seen=None):
seen = (seen, set())[seen is None]
for proposed in [(here - 1, here), (here, here + 1)][(here % 2) == 0]:
if proposed not in seen:
seen.add(proposed)
num_connected_by_pairs(assigned, assigned[proposed], seen)
return len(seen)
def valid(assigned, pairs):
self_give = [assigned[i] == i for i in range(len(assigned))]
is_reciprocal = [assigned[a] == i for i, a in enumerate(assigned)]
same_pair = [assigned[i] == i + 1 or assigned[i+1] == i for i in range(0, 2*pairs, 2)]
if pairs == 0 or True in self_give + is_reciprocal + same_pair:
return False
num_connected = [num_connected_by_pairs(assigned, here) for here in range(2, 2*pairs, 2)]
return min(num_connected) == 2*pairs
print([len([x for x in perm(range(2*pairs)) if valid(x, pairs)]) for pairs in range(0, 6)])
CROSSREFS
KEYWORD
nonn,more
AUTHOR
Russell Y. Webb, Dec 25 2018
STATUS
approved