D'après ce que je peux dire, non seulement Brian a-t-il une idée en tête, mais une proposition encore plus forte tient: chaque arête qui ne se trouve pas dans l'arbre couvrant minimum ajoute exactement un nouveau "cycle de base".
Pour voir ceci, voyons ce qui se passe lorsque vous ajoutez un bord E qui n'est pas dans le MST. Faisons la méthode mathématique préférée pour compliquer les choses et ajoutons des notations;) Appelez le graphe original G, le graphe avant d'ajouter E G ', et le graphe après avoir ajouté E G' '. Nous devons donc savoir comment le «compte du cycle de base» passe de G 'à G' '.
Ajout de E doit fermer au moins un cycle (sinon E serait dans le MST de G en premier lieu). Alors évidemment il faut ajouter au moins un "cycle de base" à ceux déjà existants dans G '. Mais en ajoute-t-il plus d'un?
Il ne peut pas en ajouter plus de deux, car aucune arête ne peut faire partie de plus de deux cycles de base. Mais si E est un membre de deux cycles de base, alors l '"union" de ces deux cycles de base doit avoir été un cycle de base dans G', de sorte que nous obtenons que le changement du nombre de cycles est toujours un.
Ergo, pour chaque arête non en MST, vous obtenez un nouveau cycle de base. La partie "count" est donc simple. Trouver tous les bords pour chaque cycle de base est un peu plus délicat, mais après le raisonnement ci-dessus, je pense que cela pourrait le faire (en pseudo-Python):
for v in vertices[G]:
cycles[v] = []
for e in (edges[G] \ mst[G]):
cycle_to_split = intersect(cycles[e.node1], cycles[e.node2])
if cycle_to_split == None:
# we're adding a completely new cycle
path = find_path(e.node1, e.node2, mst[G])
for vertex on path:
cycles[vertex].append(path + [e])
cycles
else:
# we're splitting an existing base cycle
cycle1, cycle2 = split(cycle_to_split, e)
for vertex on cycle_to_split:
cycles[vertex].remove(cycle_to_split)
if vertex on cycle1:
cycles[vertex].append(cycle1)
if vertex on cycle2:
cycles[vertex].append(cycle2)
base_cycles = set(cycles)
Modifier: le code doit trouver toute la base cycles dans un graphique (l'ensemble base_cycles en bas).Les hypothèses sont que vous savez comment:
- trouver l'arbre couvrant minimal d'un graphe (mst [G])
- trouver la différence entre les deux listes (arêtes \ mst [G])
- trouver une intersection de deux listes
- trouver le chemin entre deux sommets sur une MST
- diviser un cycle en deux en ajoutant un avantage supplémentaire à elle (la fonction split)
Et il suit principalement la discussion ci-dessus. Pour chaque arête qui n'est pas dans le MST, vous avez deux cas: soit il apporte un cycle de base complètement nouveau, soit il divise un existant en deux. Pour savoir lequel des deux est le cas, nous suivons tous les cycles de base dont un sommet fait partie (en utilisant le dictionnaire des cycles).
Salut, le lien sur le lecteur Google est mort, pourriez-vous mettre à jour si possible? – kebs