Esta biblioteca oferece duas implementações diferentes de grafos: usando Matriz de Adjacência (MatrixGraph
) e Lista de Adjacência (ListGraph
). Pode ser utilizada tanto como uma biblioteca Python quanto como um programa interativo via linha de comando.
pip install git+https://github.com/mmhqs/graphs-project.git
# Clone o repositório
git clone https://github.com/mmhqs/graphs-project.git
cd graphs-project
# Execute diretamente
python -m graphs_project.main
O projeto pode ser executado como um programa interativo de duas formas:
graphs-cli
python -m graphs_project.main
O programa oferece um menu interativo com as seguintes opções:
-
Criar Grafo
- Escolher entre matriz ou lista de adjacência
- Definir se é direcionado ou não
-
Manipular Vértices
- Adicionar vértices
- Definir pesos
- Definir rótulos
-
Manipular Arestas
- Adicionar arestas
- Remover arestas
- Modificar pesos e rótulos
-
Consultas e Verificações
- Verificar adjacência entre vértices
- Verificar adjacência entre arestas
- Verificar incidência
- Consultar quantidade de vértices e arestas
- Verificar se o grafo é vazio ou completo
Para usar como biblioteca, importe as classes necessárias:
from graphs_project.matrix import MatrixGraph
from graphs_project.list import ListGraph
A biblioteca implementa grafos com as seguintes características:
- Vértices: Podem ter peso e rótulo
- Arestas: Podem ter peso e rótulo
- Direcionamento: Os grafos podem ser direcionados ou não-direcionados
- Duas Implementações:
MatrixGraph
: Usa matriz de adjacência (melhor para grafos densos)ListGraph
: Usa lista de adjacência (melhor para grafos esparsos)
# Grafo não direcionado (padrão)
graph = MatrixGraph() # ou ListGraph()
# Grafo direcionado
graph_dir = MatrixGraph(directed=True) # ou ListGraph(directed=True)
# Adicionando um único vértice
vertex = graph.lib_add_vertex("A")
# Adicionando múltiplos vértices (V0, V1, V2, ...)
vertices = graph.lib_add_vertices(3) # Cria 3 vértices: V0, V1, V2
# Definindo peso de um vértice
graph.lib_set_vertex_weight("A", 10.5)
# Definindo rótulo de um vértice
graph.lib_set_vertex_label("A", "Início")
# Adicionando uma aresta
edge = graph.lib_add_edge(
source_id="A",
target_id="B",
weight=2.5,
label="Conexão A-B"
)
# Removendo uma aresta (por vértices)
graph.lib_remove_edge(source_id="A", target_id="B")
# Removendo uma aresta (por rótulo)
graph.lib_remove_edge(label="Conexão A-B")
# Modificando peso de uma aresta
graph.lib_set_edge_weight(
weight=3.0,
source_id="A",
target_id="B"
)
# Modificando rótulo de uma aresta
graph.lib_set_edge_label(
new_label="Nova Conexão",
source_id="A",
target_id="B"
)
Ambas as classes compartilham a mesma interface, diferindo apenas na implementação interna.
-
lib_add_vertex(vertex_id: str) -> Vertex
- Adiciona um vértice ao grafo
- Parâmetros:
vertex_id
: ID único do vértice
- Retorna: O vértice criado
- Exceções:
ValueError
se o vértice já existir
-
lib_add_vertices(count: int) -> list[Vertex]
- Adiciona múltiplos vértices
- Parâmetros:
count
: Número de vértices a criar
- Retorna: Lista dos vértices criados
- Exceções:
ValueError
se count <= 0
-
lib_set_vertex_weight(vertex_id: str, weight: float) -> Vertex
- Define o peso de um vértice
- Parâmetros:
vertex_id
: ID do vérticeweight
: Novo peso
- Retorna: O vértice atualizado
- Exceções:
ValueError
se o vértice não existir
-
lib_set_vertex_label(vertex_id: str, label: str) -> Vertex
- Define o rótulo de um vértice
- Parâmetros:
vertex_id
: ID do vérticelabel
: Novo rótulo
- Retorna: O vértice atualizado
- Exceções:
ValueError
se o vértice não existir
-
lib_add_edge(source_id: str, target_id: str, weight: float = 1, label: str = None) -> Edge
- Adiciona uma aresta ao grafo
- Parâmetros:
source_id
: ID do vértice de origemtarget_id
: ID do vértice de destinoweight
: Peso da aresta (opcional, padrão = 1)label
: Rótulo da aresta (opcional)
- Retorna: A aresta criada
-
lib_remove_edge(source_id: str = None, target_id: str = None, label: str = None) -> Edge
- Remove uma aresta do grafo
- Parâmetros (usar ou source_id+target_id OU label):
source_id
: ID do vértice de origemtarget_id
: ID do vértice de destinolabel
: Rótulo da aresta
- Retorna: A aresta removida
- Exceções:
ValueError
se a aresta não existir
-
lib_set_edge_weight(weight: float, source_id: str = None, target_id: str = None, label: str = None) -> Edge
- Define o peso de uma aresta
- Parâmetros:
weight
: Novo pesosource_id
: ID do vértice de origem (opcional)target_id
: ID do vértice de destino (opcional)label
: Rótulo da aresta (opcional)
- Retorna: A aresta atualizada
- Exceções:
ValueError
se a aresta não existir
-
lib_set_edge_label(new_label: str, source_id: str = None, target_id: str = None, old_label: str = None) -> Edge
- Define o rótulo de uma aresta
- Parâmetros:
new_label
: Novo rótulosource_id
: ID do vértice de origem (opcional)target_id
: ID do vértice de destino (opcional)old_label
: Rótulo atual da aresta (opcional)
- Retorna: A aresta atualizada
- Exceções:
ValueError
se a aresta não existir
from graphs_project.matrix import MatrixGraph
# Cria um grafo não direcionado
graph = MatrixGraph()
# Adiciona vértices
graph.lib_add_vertex("A")
graph.lib_add_vertex("B")
graph.lib_add_vertex("C")
# Adiciona arestas
graph.lib_add_edge("A", "B", weight=2.5, label="AB")
graph.lib_add_edge("B", "C", weight=1.8, label="BC")
graph.lib_add_edge("C", "A", weight=3.0, label="CA")
# Modifica alguns atributos
graph.lib_set_vertex_weight("A", 10)
graph.lib_set_edge_label(new_label="Nova_AB", old_label="AB")
from graphs_project.list import ListGraph
# Cria um grafo direcionado
graph = ListGraph(directed=True)
# Adiciona vários vértices de uma vez
vertices = graph.lib_add_vertices(5) # Cria V0, V1, V2, V3, V4
# Cria algumas arestas
graph.lib_add_edge("V0", "V1")
graph.lib_add_edge("V1", "V2")
graph.lib_add_edge("V2", "V3")
graph.lib_add_edge("V3", "V4")
graph.lib_add_edge("V4", "V0") # Cria um ciclo
# Remove uma aresta
graph.lib_remove_edge(source_id="V4", target_id="V0")
from graphs_project.matrix import MatrixGraph
graph = MatrixGraph()
# Adiciona vértices com rótulos
graph.lib_add_vertex("Start")
graph.lib_add_vertex("Middle")
graph.lib_add_vertex("End")
# Define pesos para os vértices
graph.lib_set_vertex_weight("Start", 1.0)
graph.lib_set_vertex_weight("Middle", 2.0)
graph.lib_set_vertex_weight("End", 3.0)
# Adiciona arestas com pesos e rótulos
graph.lib_add_edge("Start", "Middle", weight=5.0, label="Início")
graph.lib_add_edge("Middle", "End", weight=5.0, label="Fim")
# Modifica os pesos das arestas
graph.lib_set_edge_weight(10.0, source_id="Start", target_id="Middle")
- Suporte para grafos direcionados e não direcionados
- Implementação com matriz de adjacência e lista de adjacência
- Adição e remoção de vértices e arestas
- Ponderação e rotulação de vértices e arestas
- Verificação de adjacência e incidência
- Análise de propriedades do grafo