Algoritmo ingênuo para detectar pontes em um grafo
Problema: Dado um grafo não dirigido
Uma abordagem simples para resolver esse problema de detecção de pontes no grafo, podemos remover cada aresta do grafo e verificar se essa remoção desconecta o grafo.
- Iterar sobre cada aresta
: O algoritmo percorre todas as arestas do grafo G. - Remover a aresta: A aresta em teste é removida temporariamente.
- Verificar a conectividade: Após a remoção, o algoritmo verifica se o grafo ainda está conexo. Isso pode ser feito com uma busca em profundidade (DFS) ou busca em largura (BFS) para ver se todos os vértices ainda são alcançáveis a partir de um ponto de partida.
- Adicionar a aresta de volta: O estado original do grafo é restaurado para o teste da próxima aresta. Se a aresta foi identificada como uma ponte, ela é registrada.
Implementação em C
void dfs(int u, bool visited[]) {
visited[u] = true;
for (int v = 0; v < V; v++) {
if (G[u][v] && !visited[v]) {
dfs(v, visited);
}
}
}
bool is_connected() {
bool visited[MAX_VERTICES] = {false};
int start_node = -1;
for(int i = 0; i < V; i++) {
for(int j = 0; j < V; j++) {
if(G[i][j]) {
start_node = i;
break;
}
}
if (i != -1) break;
}
if (start_node == -1) {
return true;
}
dfs(start_node, visited);
for (int i = 0; i < V; i++) {
bool has_edge = false;
for(int j = 0; j < V; j++) {
if(G[i][j]) {
has_edge = true;
break;
}
}
if (has_edge && !visited[i]) {
return false;
}
}
return true;
}
void detect_bridges() {
printf("Bridges found:\n");
for (int u = 0; u < V; u++) {
for (int v = u + 1; v < V; v++) {
if (G[u][v]) {
remove_edge(u, v);
if (!is_connected()) {
printf("(%d, %d)\n", u, v);
}
add_edge(u, v);
}
}
}
}Complexidade: