コード例 #1
0
ファイル: djikstra.py プロジェクト: caetanoct/graph-theory
def djikstra(arquivo, s):

    # Inicialização
    G = GrafoDicionario(arquivo)
    Tab = tabelaDj(G, s)
    while not Tab.nVisitados():
        #selecionar um vertice nao visitado que tenha o menor D
        u = Tab.getNotVisited()
        Tab.setVisitado(u)
        #loop para cada vertice vizinho de u nao visitado
        for vizinho in G.vizinhos(u):
            distAtual = Tab.getDistancia(u) + G.grafo[u][vizinho]
            if Tab.getDistancia(vizinho) > distAtual:
                Tab.setDistancia(distAtual, vizinho)
                Tab.setAncestral(u + 1, vizinho)
    #print(Tab)
    return Tab.Result()
コード例 #2
0
 def subGrafo(self,Pset):
     arestas = []
     arestas_set = []
     for vertice in Pset:
         vizinhos = list((self.G.vizinhos(vertice)).keys())
         for vizinho in vizinhos:
             if vizinho in Pset:
                 arestas.append((int(vertice), int(vizinho), float(0.0)))
                 arestas_set.append({int(vertice), int(vizinho)})
     subG = GrafoDicionario(None,False,Pset,arestas,arestas_set)
     #print(subG)
     return subG
コード例 #3
0
def ciclo_euleriano(arquivo):
    def buscarSubcicloEuleriano(G, v, C):
        # Marca início do ciclo
        ciclo = [v]
        t = v
        while True:
            # Só prossegue se existir uma aresta não-visitada conectada a Ciclo
            for u in G.vizinhos(v).keys():
                if {u, v} in C or {v, u} in C:
                    break
            else:
                return None

            # Prosseguindo, marca a aresta como visitada, isto é, remove-la de C
            C.remove({v, u})
            # Adiciona o vértice v ao final do ciclo
            v = u
            ciclo.append(v)
            # Ciclo encontrado
            if v == t:
                break

        # Para todo vértice x no ciclo que tenha uma aresta adjacente não visitada
        for i in range(len(ciclo)):
            c = ciclo[i]
            for u in G.vizinhos(c).keys():
                # Se há uma aresta no ciclo que possui aresta não visitadas
                if {u, c} in C or {c, u} in C:
                    novo_ciclo = buscarSubcicloEuleriano(G, c, C)
                    if not novo_ciclo:
                        return None
                    # Inclui o novo ciclo no ciclo anterior
                    ciclo.pop(i)
                    for v in novo_ciclo[::-1]:
                        ciclo.insert(i, v)
        return ciclo

    # Inicialização
    G = GrafoDicionario(arquivo)
    C = G.E_set
    v = 0  # Altere aqui o indice

    return buscarSubcicloEuleriano(G, v, C)
コード例 #4
0
        #    Glin = self.subGrafo(self.powersets[31])
            #print(Glin)
            vertices = Glin.getVertices()
            conjuntos = self.independentesMaximais(Glin)
            indMax = conjuntos
            #self.printTab()
            if len(conjuntos) > 0:
                #print(conjuntos)
                for conjunto in conjuntos:
                    #print(conjunto)
                    ids = []
                    cVertices = vertices.copy()
                    #subtraio do meu Glin o conjunto atual
                    for c in conjunto:
                        cVertices.pop(self.retIDlista(cVertices,c))
                    cVertices.sort()
                    #busco o valor do que sobrou na tabela e somo +1 e salvo para ver se algum conjunto consegue menor valor
                    val = self.consultaTab(cVertices) + 1
                    valAtual = self.consultaTab(vertices)
                    if val < valAtual:
                        self.preencheTab(vertices,val)   
        self.printTab()
        return self.X[self.i-1]


if __name__ == '__main__':
    
    arquivo = input('Nome do arquivo: ')
    grafo = Lawler(GrafoDicionario(arquivo,True))
    cores = grafo.executar()
    print("Minimo necessário de cores: ",cores)
コード例 #5
0
# 2) Ordenação Topológica
from grafo_dicionario import GrafoDicionario

# Le o nome do aqruivo e a posicao do vertice inicial
# arquivo = input('Nome do arquivo: ')
arquivo = input('Nome do arquivo: ')

# Cria o grafo
grafo = GrafoDicionario(arquivo)

# Inicializacao

# Ordenação Topológica


# DFS
def dfs_visit_ot(v):
    C[v] = True
    for u in grafo.vizinhos_dir(v):
        if not C[u]:
            dfs_visit_ot(u)
    O.insert(0, v)


# DFS-Visit-OT
C = [False for _ in range(grafo.qtd_vertices())]
O = []
for u in grafo.grafo.keys():
    if not C[u]:
        dfs_visit_ot(u)
コード例 #6
0
    C[v] = True
    tempo += 1
    T[v] = tempo
    for u in G.vizinhos_dir(v):
        if not C[u]:
            A[u] = v
            tempo = dfs_visit(G, u, C, T, A, F, tempo)
    tempo += 1
    F[v] = tempo
    return tempo


# Le o nome do aqruivo e a posicao do vertice inicial
# arquivo = input('Nome do arquivo: ')
arquivo = input('Nome do arquivo: ')
G = GrafoDicionario(arquivo)

# Componentes Fortemente Conexas

# Tornando V global para evitar criar 2 métodos dfs
V = G.grafo.keys()

# Primeira busca
C, T, Al, F = dfs(G)

# Ordenando V, basead em F, para a segunda busca
# Ordenando por index
F = sorted(range(len(F)), key=lambda i: F[i])
F.reverse()
V = F
コード例 #7
0
                    elif D[mate[vertice2]] == inf:
                        D[mate[vertice2]] = D[vertice] + 1
                        Q.append(mate[vertice2])
        return D[self.numE] != inf

    def retMatchs(self):
        mt = []
        for vt1, vt2 in zip(self.X, self.mate):
            #print("[",vt1,",",vt2,"]")
            mt.append([vt1, vt2])
        return mt

    def executar(self):  # Parece OK
        m = 0
        while self.BFS(self.G, self.mate, self.D) == True:
            for x in self.X:
                if self.mate[x] == None:
                    if self.DFS(self.G, self.mate, x, self.D):
                        m = m + 1
        return m, self.retMatchs()


if __name__ == '__main__':

    #arquivo = input('Nome do arquivo: ')
    arquivo = "teste_hop2.txt"
    G = GrafoDicionario(arquivo, True)
    hop = Hop(G)
    nMatch, matchs = hop.executar()
    print("Numero de Matchs: ", nMatch)
    print("Matchs: ", matchs)
コード例 #8
0
# Busca em largura
from grafo_dicionario import GrafoDicionario
from math import inf

# Le o nome do aqruivo e a posicao do vertice inicial
arquivo = input('Nome do arquivo: ')
posicao_inicial = int(input('Posicao do vertice inicial: '))

# Cria o grafo
grafo = GrafoDicionario(arquivo)
s = posicao_inicial - 1

# Inicializacao
C = [False for _ in range(grafo.qtd_vertices())]
D = [inf for _ in range(grafo.qtd_vertices())]
A = [None for _ in range(grafo.qtd_vertices())]
C[s] = True
D[s] = 0
Q = []
Q.append(s)

# Busca em largura
i = 0
while Q:
    u = Q.pop(0)
    for v in grafo.vizinhos(u).keys():
        if C[v] == False:
            C[v] = True
            D[v] = D[u] + 1
            A[v] = u
            Q.append(v)