Exercice 6
Le code suivant ne marche pas.
Corriger la fonction arbre_couvrant
.
class Noeud:
# Variable de classe, pour avoir un affichage plus lisible
counter = 1
def __init__(self, out):
assert isinstance(out, list), "Pas une liste"
assert all(isinstance(n, Noeud) for n in out), "Pas une liste de noeuds"
self.out = out
self.cnt = Noeud.counter
Noeud.counter += 1
def __repr__(self):
if hasattr(self, 'weight'):
s = " ".join("→{0}({1})".format(u.cnt,w) for u,w in zip(self.out,self.weight))
else:
s = " ".join("→{0}".format(u.cnt) for u in self.out)
return "Noeud({0}) ".format(self.cnt) + s
class Graphe:
def __init__(self, noeuds):
assert isinstance(noeuds, list), "Pas une liste"
assert all(isinstance(n, Noeud) for n in noeuds), "Pas une liste de noeuds"
self.noeuds = noeuds
def __repr__(self):
return "Graphe:\n\t" + "\n\t".join(map(repr, self.noeuds))
def adjacence(self):
# On remplit la matrice de 0
mat = [[0 for _ in self.noeuds] for _ in self.noeuds]
# On met les 1
for (i,v) in enumerate(self.noeuds):
if hasattr(v, 'weight'):
for u,w in zip(v.out,v.weight):
mat[i][self.noeuds.index(u)] = w
else:
for u in v.out:
mat[i][self.noeuds.index(u)] = 1
return Matrice(mat)
def arbre_couvrant(G):
for u in G.noeuds:
u.set = u
L = []
for u in G.noeuds:
for v,w in zip(u.out, u.weight):
L.append(((u,v),w)) # Arrete (u,v) de poids w
L.sort(key=(lambda x: x[1]))
for (u,v),w in L:
if u.set != v.set:
Arbre.append((u,v))
poids += w
# Fusion des composantes: on remplace u.set par v.set
for s in G.noeuds:
if s.set == u.set:
s.set = v.set
return Arbre,poids