Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions Graph/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
Nesse projeto, está implementado um exemplo de grafo e uma busca em largura exemplificado no livro "Entendendo algoritmos".

## Grafo

Um grafo é uma estrutura matemática utilizada para modelar relações entre objetos. É composto por dois elementos principais:

- **Vértices** (ou nós): Representam os objetos ou entidades.
- **Arestas** (ou ligações): Representam as conexões ou relações entre os vértices.

### Tipos de Grafos
- **Grafo Não Direcionado**: As arestas não têm direção, ou seja, a relação entre os vértices é bidirecional.
- **Grafo Direcionado** (ou dígrafo): As arestas têm uma direção, indicando uma relação unidirecional entre os vértices.


### Aplicações de Grafos
Grafos são utilizados em diversas áreas, como:

- **Redes de Computadores**: Para modelar a interconexão entre diferentes dispositivos.
- **Redes Sociais**: Para representar relações de amizade, seguidores, etc.
- **Roteamento**: Para encontrar o caminho mais curto ou mais eficiente entre dois pontos.
- **Bioinformática**: Para modelar relações entre genes e proteínas.

## Busca em Largura (BFS)
A **Busca em Largura** (**BFS** - Breadth-First Search) é um algoritmo de travessia ou busca em grafos que explora os vértices de um grafo de maneira sistemática, nível por nível. A BFS é particularmente útil para encontrar o caminho mais curto em grafos não ponderados.

### Como a BFS Funciona
- **Inicialização**: Comece pela raiz (ou nó inicial) e coloque-o em uma fila.
- **Exploração**: Remova o vértice da frente da fila, marque-o como visitado e coloque todos os seus vizinhos não visitados na fila.
- **Repetição**: Repita o processo de exploração até que a fila esteja vazia ou o nó de destino seja encontrado.

_Exemplo_:

Considere o seguinte grafo não direcionado:

```
A
/ \
B C
| |
D E
```
Passos da BFS a partir do nó A:

1. Inicialização:
- **Fila**: [A]
- **Visitados**: {A}


2. Exploração do nó A:
- **Fila**: [B, C]
- **Visitados**: {A, B, C}

3. Exploração do nó B:
- **Fila**: [C, D]
- **Visitados**: {A, B, C, D}

4. Exploração do nó C:
- **Fila**: [D, E]
- **Visitados**: {A, B, C, D, E}

5. Exploração do nó D:
- **Fila**: [E]
- **Visitados**: {A, B, C, D, E}

6. Exploração do nó E:
- Fila: []
- Visitados: {A, B, C, D, E}

Ao final do processo, todos os nós alcançáveis a partir de A foram visitados na ordem de suas distâncias da raiz.

### Aplicações da BFS
- Encontrar o caminho mais curto em grafos não ponderados.
- Verificar conectividade entre dois vértices.
- Construção de árvores de cobertura mínima em grafos não direcionados.

17 changes: 17 additions & 0 deletions Graph/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>Graph</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

</project>
59 changes: 59 additions & 0 deletions Graph/src/main/java/org/example/Graph.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.example;

import java.util.*;

public class Graph {
private Map<String, List<String>> adjList;

public Graph() {
adjList = new HashMap<>();
}

public void addVertex(String vertex) {
adjList.putIfAbsent(vertex, new ArrayList<>());
}

public void addEdges(String vertex, List<String> listOfVertex) {
adjList.putIfAbsent(vertex, new ArrayList<>());
adjList.get(vertex).addAll(listOfVertex);
//adjList.get(vertex2).add(vertex1); //Para grafos não direcionados
}
public Map<String, List<String>> getAdjList() {
return adjList;
}

public void printGraph() {
for (String vertex : adjList.keySet()) {
System.out.print(vertex + " -> ");
for (String neighbor : adjList.get(vertex)) {
System.out.print(neighbor + " ");
}
System.out.println();
}
}

public void breathFirstSearch(String initialVertex) {
Queue<String> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();

visited.add(initialVertex);
queue.add(initialVertex);

while(!queue.isEmpty()) {
String vertex = queue.poll();

if(isMangoSeller(vertex)) {
System.out.println("Found it: " + vertex);
return;
} else {
queue.addAll(adjList.get(vertex));
}
}

System.out.println("Didnt find it.");
}

public boolean isMangoSeller(String vertex) {
return vertex.endsWith("m");
}
}
24 changes: 24 additions & 0 deletions Graph/src/main/java/org/example/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.example;

import java.util.List;

public class Main {
public static void main(String[] args) {

System.out.println("Hello world!");

Graph graph = new Graph();
graph.addEdges("voce", List.of("alice", "bob", "claire"));
graph.addEdges("bob", List.of("anuj", "peggy"));
graph.addEdges("claire", List.of("thom", "jonny"));
graph.addEdges("alice", List.of("peggy"));
graph.addVertex("anuj");
graph.addVertex("peggy");
graph.addVertex("thom");
graph.addVertex("jonny");

graph.printGraph();

graph.breathFirstSearch("voce");
}
}
Binary file added Graph/target/classes/org/example/Graph.class
Binary file not shown.
Binary file added Graph/target/classes/org/example/Main.class
Binary file not shown.