Pour un DAG donné (graphe acyclique dirigé), chacune de ses sortes topologiques est une permutation de tous les sommets, où pour chaque arête (u, v) dans le DAG, u apparaît avant v dans la permutation.
Votre tâche consiste à calculer le nombre total de types topologiques d'un DAG donné.
Règles
- Vous pouvez utiliser n'importe quel format pour représenter le graphique, comme la matrice d'adjacence, la liste d'adjacence ou la liste de bords, tant que vous ne faites pas de calculs utiles dans votre codage. Vous pouvez également avoir des éléments comme le nombre de sommets ou la liste de sommets dans l'entrée, si ceux-ci sont utiles.
- Vous pouvez supposer que le graphique dans l'entrée est toujours un DAG (n'a pas de cycle).
- Votre programme devrait fonctionner en théorie pour toute entrée. Mais il peut échouer s'il déborde du type entier de base dans votre langue.
- Les noms des sommets peuvent être des valeurs consécutives de n'importe quel type. Par exemple: des nombres commençant à 0 ou 1. (Et seulement si vous ne stockez pas de code dans ce numéro, bien sûr.)
- C'est du code-golf. Le code le plus court gagne.
Exemple
Il s'agit de la même entrée dans différents formats. Votre programme ne doit pas tous les accepter. Les sommets sont toujours des entiers commençant à 0.
Adjacency list:
[ [1 2 3 5] [2 4] [] [2] [] [3] ]
Adjacency matrix:
[ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 0 0 0] [0 0 0 1 0 0] ]
Edge list:
6 [ [0 1] [0 2] [0 3] [0 5] [1 2] [1 4] [3 2] [5 3] ]
C'est le graphique montré dans cette image:
La sortie doit être:
9
Les types topologiques sont:
[0 1 4 5 3 2]
[0 1 5 4 3 2]
[0 1 5 3 4 2]
[0 1 5 3 2 4]
[0 5 1 4 3 2]
[0 5 1 3 4 2]
[0 5 1 3 2 4]
[0 5 3 1 4 2]
[0 5 3 1 2 4]
code-golf
combinatorics
graph-theory
permutations
jimmy23013
la source
la source
Réponses:
CJam - 25
Avec la grande aide de user23013 :)
Essayez-le en ligne
Explication:
L'algorithme général est le même que dans la solution Python de xnor .
La clé ici est l'
j
opérateur, qui effectue la récursion mémorisée. Il prend un paramètre, une valeur ou un tableau pour la ou les valeurs initiales (comme dans f (0), f (1), etc.) et un bloc pour définir la récursivité. L'j
opérateur est à nouveau utilisé à l'intérieur du bloc pour effectuer des appels récursifs (et mémorisés) vers le même bloc. Il peut également être utilisé avec plusieurs paramètres, mais ce n'est pas le cas ici.La grande innovation de user23013 est d'utiliser j avec différents types de données, en utilisant la liste d'adjacence comme tableau de valeurs initiales.
la source
Python, 58
L'entrée se compose d'un dictionnaire d'adjacence
G
et d'un ensemble de sommetsV
.Le code est récursif. L'ensemble
V
stocke tous les nœuds qui doivent encore être visités. Pour chaque prochain nœud potentiel, nous vérifions sa pertinence en voyant si aucun sommet ne pointe vers lui, enV-G[v]==V
vérifiant celaV
et s'ilsG[v]
sont disjoints. Pour tous ces sommets appropriés, nous ajoutons le nombre de tris topologiques avec celui-ci supprimé. Comme cas de base, l'ensemble vide donne 1.la source
Mathematica,
805751 octetsMise en œuvre très simple de la définition. Je ne fais que générer toutes les permutations et je compte combien d'entre elles sont valides. Pour vérifier si une permutation est valide, j'obtiens toutes les paires de sommets dans la permutation. Commodément,
Subsets[l,{2}]
non seulement me donne toutes les paires, mais il maintient également l'ordre dansl
lequel elles se trouvent - exactement ce dont j'ai besoin.Ce qui précède est une fonction qui attend la liste des sommets et la liste des bords, comme
si vous appelez la fonction
f
.J'essaierai de jouer au golf, ou j'utiliserai peut-être une autre approche plus tard.
la source
Pyth, 27 octets
Définit une fonction d'entrée 2,
g
. La première entrée est le nombre de sommets, la seconde est la liste des arêtes dirigées.Tester:
Essayez-le ici.
la source
^UGG
, qui génère toutesG
les listes d'entrées derange(len(G))
.[0, 1, ...]
directement dans l'entrée?^GlG
rapport^UGG
.Haskell,
1021071008985 octetsL'entrée est le nombre de sommets le plus élevé (commençant par 0) et une liste d'arêtes, où une arête est une liste à deux éléments. Exemple d'utilisation:
5 # [[0,1], [0,2], [0,3], [0,5], [1,2], [1,4], [3,2], [5,3]]
Comment ça marche: compter toutes les permutations
p
des sommets pour lesquelles toutes les arêtes[u,v]
satisfont: la position deu
inp
est inférieure à la position dev
inp
. Il s'agit d'une mise en œuvre directe de la définition.Edit: ma première version a renvoyé les types topologiques eux-mêmes et non le nombre. A corrigé.
Edit II: ne fonctionnait pas pour les graphiques avec des sommets non connectés. A corrigé.
la source