Contexte
Supposons qu'il y ait des 2*n
personnes à marier et supposons en outre que chaque personne soit attirée par exactement d' n
autres personnes sous les contraintes suivantes:
- L'attraction est symétrique ; c'est-à-dire que si la personne
A
est attirée par la personneB
, alors la personneB
est attirée par la personneA
. - L'attraction est antitransitive ; c'est-à-dire que si la personne
A
et la personneB
sont chacune attirées par la personneC
, alors la personneA
et la personneB
ne sont pas attirées l'une par l'autre.
Ainsi, le réseau d'attractions forme le graphe bipartite complet (non dirigé) Kn,n
. Nous supposons également que chaque personne a classé les personnes qu'elle attire. Ceux-ci peuvent être représentés comme des poids de bord dans le graphique.
Un mariage est un couple (A,B)
où A
et B
sont attirés les uns aux autres. Le mariage est instable s'il y a un autre mariage où une personne de chaque mariage pourrait divorcer de son partenaire et se marier et se retrouver avec une personne de rang supérieur à leur ancien partenaire.
Objectif
Votre tâche consiste à écrire un programme ou une fonction complète qui prend en compte les préférences de chaque personne et génère un mariage pour chaque personne de sorte que chaque mariage soit stable.
Contribution
L'entrée peut être dans n'importe quel format pratique; par exemple, graphique pondéré, liste ordonnée de préférences, dictionnaire / association, etc. Vous pouvez éventuellement prendre le nombre total de personnes en entrée, mais aucune autre entrée n'est autorisée.
Production
La sortie peut également être dans n'importe quel format pratique; par exemple liste de tuples, couverture minimale des bords , une fonction qui associe à chaque personne son partenaire, etc. Notez que la seule contrainte est que chaque mariage est stable, il n'y a pas d'autre exigence d'optimalité.
Remarques
- Vous pouvez trouver plus d'informations et un
O(n^2)
algorithme pour résoudre ce problème sur Wikipedia ou cette vidéo Numberphile . Vous êtes cependant libre d'utiliser n'importe quel algorithme. - Les failles standard sont interdites.
- C'est du code-golf . La réponse la plus courte (en octets) l'emporte.
la source
Réponses:
Mathematica, 28 octets
On pourrait penser que c'est de la triche. Pour moi comme ça:
(Oui
Combinatorica
est déconseillé mais il coûte moins d'octets queFindIndependentEdgeSet
)Exemple (GoT-like): (Pour être juste - j'ai deviné les poids ... mais je suis d'accord avec les résultats)
la source