[Python] Comment créer une matrice de contiguïté / liste de contiguïté [Théorie des graphes]

introduction

Lors de la programmation compétitive, le mur qui frappe tôt ou tard est la «théorie des graphes». C'est un problème lié à (?) La théorie des graphes qui commence par la recherche de priorité de largeur et la recherche de priorité de profondeur et a une étendue infinie, mais cette fois comment créer une "matrice d'adjacence" et une "liste d'adjacence" en Python J'ai résumé sur. Il sera mis à jour de temps en temps ...

Matrice adjacente et liste de contiguïté

Par exemple, considérons le graphique suivant. fig.png

Il existe deux principaux types de structures de données graphiques sur un ordinateur. Utilisons-le correctement en fonction de la situation. L'une est la «matrice adjacente», qui se présente sous la forme d'une matrice $ n \ times n $. Bien qu'il utilise beaucoup de mémoire, il a l'avantage de pouvoir déterminer s'il y a ou non un front spécifique dans un temps fixe.

adj_m.txt


[[0, 1, 1, 0, 1],
 [1, 0, 1, 1, 0],
 [1, 1, 0, 1, 1],
 [0, 0, 1, 1, 1],
 [1, 0, 1, 1, 0]]

L'autre est la «liste adjacente». Bien qu'il utilise moins de mémoire, il a l'inconvénient qu'il faut au pire $ O (V) $ pour déterminer s'il existe un bord spécifique.

adj_l.txt


[[2, 3, 5], [1, 3, 4], [1, 2, 4, 5], [2, 3, 5], [1, 3, 4]]

Le problème réel est que l'on vous donne «deux extrémités des côtés», comme AtCoder Beginners Contest 168 D .. (Double Dots). Il y a beaucoup de.

Lorsque j'essaie d'exprimer l'entrée de ce graphique, cela devient comme suit. (Le nombre de sommets n et le nombre de côtés m sont entrés dans la première ligne)

input.txt


5 8
1 2
1 3
1 5
2 3
2 4
3 4
3 5
4 5

code

J'écrirai une feuille de triche qui les convertit en matrices de contiguïté et listes de contiguïté.

Entrée dans la matrice adjacente

Quand il n'y a pas de poids

input_to_adj_m.py


n, m = map(int, input().split())
p = [list(map(int, input().split())) for _ in range(m)]

l = [[0]*n for i in range(n)]
for v in p:
    l[v[0]-1][v[1]-1] = 1
    l[v[1]-1][v[0]-1] = 1  #Effacer s'il s'agit d'un graphe orienté

print(l)  # [[0, 1, 1, 0, 1], ..., [1, 0, 1, 1, 0]]

S'il y a du poids, cela changera légèrement.

input_to_adj_m.py


n, m = map(int, input().split())
p = [list(map(int, input().split())) for _ in range(m)]

graph = [[0]*n for _ in range(n)]
for v in p:
    graph[v[0]-1][v[1]-1] = v[2]  #Ici change
    graph[v[1]-1][v[0]-1] = v[2]  #Effacer s'il s'agit d'un graphe orienté

print(graph)  # [[0, 1, 1, 0, 1], ..., [1, 0, 1, 0, 0]]

Entrée dans la liste adjacente

input_to_adj_l.py


n, m = map(int, input().split())
p = [list(map(int, input().split())) for _ in range(m)]

graph = [[] for _ in range(n)]
for v in p:
    graph[v[0]-1].append(v[1])
    graph[v[1]-1].append(v[0])  #Effacer s'il s'agit d'un graphe orienté

print(graph)  # [[2, 3, 5], ..., [1, 3, 4]]

en conclusion

Merci pour la lecture. Je vous serais reconnaissant de bien vouloir me faire savoir s'il y a des erreurs ou des erreurs typographiques.

Recommended Posts

[Python] Comment créer une matrice de contiguïté / liste de contiguïté [Théorie des graphes]
[Python] Comment utiliser la liste 1
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment créer un package Python (écrit pour un stagiaire)
[Python] Comment utiliser la liste 3 Ajouté
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
[Python] Comment créer une matrice de motifs répétitifs (repmat / tile)
[Python] Comment rendre une classe itérable
python3 Comment installer un module externe
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
Comment convertir Python en fichier exe
Résumé de l'utilisation de la liste Python
Comment créer un pilote de périphérique Linux intégré (11)
Comment créer un pilote de périphérique Linux intégré (8)
Comment effacer un taple dans une liste (Python)
Comment créer un pilote de périphérique Linux intégré (4)
Comment créer un pilote de périphérique Linux intégré (7)
Comment créer un pilote de périphérique Linux intégré (2)
Comment recadrer une image avec Python + OpenCV
Comment créer un pilote de périphérique Linux intégré (3)
[Algorithm x Python] Comment utiliser la liste
Comment créer un pilote de périphérique Linux intégré (6)
Comment créer le plugin Python de Substance Painter (Introduction)
Comment créer un pilote de périphérique Linux intégré (5)
Comment créer un pilote de périphérique Linux intégré (10)
Comment rendre le Python des débutants plus rapide [numpy]
Comment apporter des modifications à l'interpréteur Python dans Pycharm
Comment créer un pilote de périphérique Linux intégré (9)
Comment supprimer les éléments en double dans la liste Python 3
Comment installer Python
Comment installer python
Comment utiliser la liste []
[Python] Comment supprimer les valeurs en double de la liste
Expliquez en détail comment créer un son avec python
Comment écrire un type liste / dictionnaire de Python3
[Python] Comment utiliser la bibliothèque de création de graphes Altair
Comment créer un outil CLI interactif avec Golang
Comment créer un package Python à l'aide de VS Code
[Python] Comment trier un dict dans une liste et une instance dans une liste
Comment créer un serveur HTTPS avec Go / Gin
[Python] Je veux faire d'une liste imbriquée un taple
Comment créer un téléchargeur d'image avec Bottle (Python)
[Python] Comment créer une matrice de corrélation et une carte thermique
Comment créer un pilote de périphérique Linux intégré (12) (Terminé)
[Python] Comment afficher les valeurs de liste dans l'ordre
Comment installer Python [Windows]
python3: Comment utiliser la bouteille (2)
[Python] Convertir la liste en Pandas [Pandas]
Comment convertir un tableau en dictionnaire avec Python [Application]
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
Comment mélanger une partie de la liste Python (au hasard.shuffle)
Comment mettre à jour Tkinter de Python vers la version 8.6
[Python] Comment écrire une instruction if en une phrase.
Comment utiliser Python Argparse
Python: comment utiliser pydub
[Python] Comment utiliser checkio
Comment obtenir la dernière (dernière) valeur d'une liste en Python