From 2a426b08e389086ce763ee22bcb9c35539ca7871 Mon Sep 17 00:00:00 2001 From: monicaribeiro Date: Thu, 25 Jul 2024 11:13:25 -0300 Subject: [PATCH] Adding graph example. --- Graph/README.md | 75 +++++++++++++++++++ Graph/pom.xml | 17 +++++ Graph/src/main/java/org/example/Graph.java | 59 +++++++++++++++ Graph/src/main/java/org/example/Main.java | 24 ++++++ Graph/target/classes/org/example/Graph.class | Bin 0 -> 3376 bytes Graph/target/classes/org/example/Main.class | Bin 0 -> 1192 bytes 6 files changed, 175 insertions(+) create mode 100644 Graph/README.md create mode 100644 Graph/pom.xml create mode 100644 Graph/src/main/java/org/example/Graph.java create mode 100644 Graph/src/main/java/org/example/Main.java create mode 100644 Graph/target/classes/org/example/Graph.class create mode 100644 Graph/target/classes/org/example/Main.class diff --git a/Graph/README.md b/Graph/README.md new file mode 100644 index 0000000..e3f95ce --- /dev/null +++ b/Graph/README.md @@ -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. + diff --git a/Graph/pom.xml b/Graph/pom.xml new file mode 100644 index 0000000..0337acf --- /dev/null +++ b/Graph/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + org.example + Graph + 1.0-SNAPSHOT + + + 19 + 19 + UTF-8 + + + \ No newline at end of file diff --git a/Graph/src/main/java/org/example/Graph.java b/Graph/src/main/java/org/example/Graph.java new file mode 100644 index 0000000..1877025 --- /dev/null +++ b/Graph/src/main/java/org/example/Graph.java @@ -0,0 +1,59 @@ +package org.example; + +import java.util.*; + +public class Graph { + private Map> adjList; + + public Graph() { + adjList = new HashMap<>(); + } + + public void addVertex(String vertex) { + adjList.putIfAbsent(vertex, new ArrayList<>()); + } + + public void addEdges(String vertex, List listOfVertex) { + adjList.putIfAbsent(vertex, new ArrayList<>()); + adjList.get(vertex).addAll(listOfVertex); + //adjList.get(vertex2).add(vertex1); //Para grafos não direcionados + } + public Map> 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 queue = new LinkedList<>(); + Set 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"); + } +} diff --git a/Graph/src/main/java/org/example/Main.java b/Graph/src/main/java/org/example/Main.java new file mode 100644 index 0000000..fcb2af0 --- /dev/null +++ b/Graph/src/main/java/org/example/Main.java @@ -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"); + } +} \ No newline at end of file diff --git a/Graph/target/classes/org/example/Graph.class b/Graph/target/classes/org/example/Graph.class new file mode 100644 index 0000000000000000000000000000000000000000..8f5670a48599e4c57e03d443264a2238b9568700 GIT binary patch literal 3376 zcmb_eTXz#x6#h<=GHE)cZMa!fh)|&SctH??NGX(7+5!fO1yrWZ&()vCE=J&fjUBza_0KS8*$D zW3b~oq1IM_s-UP~g}}m+Q_}BR+>W@4JFto=)Y9p0(-de5@Vwmh*rv%08@82fJtS>6 zt5}1z6ra$iQ__56OJK~C=T@>7EofEHrlK7kvl8JcL=0EYX|A0USUO9$KiDTg7ZM8Y zRB;#X7KoLcE{d>98O<5ePtpOFoSt=Iy^4FWK_F~-+l!0XXWo#=V@t)Uk<}g?4_DZWnG(0#z@j_D!Q>ttfV2r-EJ;yUXj}_x<%QdqbkNg19gTo$Ue7I zI%!D4RE+pgjPt<@c3cMAr@)vMVu{1jRy+cdeBllwZMpGdhLw&RZdU}BfS8P8BeE(^ zNYfGBN;|TM0yQaP+|t~9P8ZnabHF1z`+7@RhXxfW6Od`GAh9*MHA$ZK*l7aRvjX~1 zesWaL?bk+4?!*S{G0hy-a)$g4Hp6blAdMCc%$rz*s$n&T^_;7pWMfVRi`abE7!@UV zrpI+ct*OACIld=bhXquVQS3QZ#BZ1@!#1An@N~B5bn_h9in$Qj^xvLT)Rf*uIRm?k z1AF!?k|SH7zc>f}hmu9TCJN4ph@~6jnNc~%>Qb&YHbHwqu^LA?8Qe^-k#pRXuI0u^ zqB?m(8LVqip6U~_BiL+ZIr5r>J}Xm(!zoD?mLEZKwz6z<nzHk` zF}>H2#EW{7b;+jX6x?pxuH*7d9Ms*6op$OM;G-x$#wQ9+%W-!`pxNthZ@?PXls%y* z{2uTpV6QgDDL*Z6y1c%Dpby%oS!q*ung?uqBA+ck0cSN+xdmTwKS@?W{IDN%`N%IH zvVrX$%`{WYZ!&^UIZZ{pb1SF9=K@uN?=N{)_u6@HFl>$sHbB2+>A4=z>@?NcnVMRpLFzD0!v5M%?I{&3TUdrRovcDz{)D$ zSO_Km8)+cSs7k4-4ovwVFY*7&GbQ+gTGf=dB}f6Q1qxUvFwkB=r@$GEaB+`dY#RrE z!lsVPyu;!mdZaXi^`kDJUtp*+&{)BRudz8ym8S4zJm~41zxg}AFJkxko9ARX{0yyP zb%Etr#d}~EZo>f{`J-3?9V;=xTv=pOF>41{wpUo3Fs1vwtjSW^L3pony$s>&s8`T+ z19vId$i+3R{*xvIUMtc>G}E+<*}Q@wGGy=I73||XHPp#q_p^Q-d_OGT1soPQi~G5F z)JwwVa9dOOBD6DT3}Vw|Y{xEi$c!|FgOp?nI8OcZH?LAEHX#LQFYMK41A_pX>C+ls zwb$VmUPa<)Lo2VC>(R-3TNe|Sz;50ckK!I)9`0o#Hh4)`Pruir!wWquBbXtPiPt^W zMv%rEc#~Caz!AKKw;AgxN=lad|K6GT_b&g*q%B712I2}v6trAN8}oLJi4^kM!l&ea zk~%WgN_%YbBJ3ZyEGOG0&pE%5lo^+lfY%|s=gGg15BR1rd`Q@{-t#l>`31h>pD1^~ K#<%zmO@9M&B{>=Z literal 0 HcmV?d00001 diff --git a/Graph/target/classes/org/example/Main.class b/Graph/target/classes/org/example/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..960ead597d732b47b707b969f9bc29767c828690 GIT binary patch literal 1192 zcma)5YflqF6g|Uhw`F;Bfug896ttztiYSUjPvi*`N8v@;#3rah-okl3}KjIs7)7xR#g~|OR$M1Zb*5V9u@byu;IZ1WXgJXGA*~sBqKadA+LEBOCH-2E72GeBG(4jvYn|*a zm$V06>t0bX3}mD$_Ue_q@L%z~LlHCM6}Xe*zEu8MkQ7O}TgtVphyqFzQY8e8C*HP< z@qDw?E&De04z)?s1=(uPD0=}p)J4$ItXKC7VoNGw5%s=#wNo^vr}WXOUk3;SJ!IF( zv*^j_***Ii>|>bTAgj_8#3ote?7W3-@*>#5bBd_uA5@`0?N89mz6J)qV&u(djAl~i zC3DQYYL1^`vVof^I?kGNr`muolyrAd-V#vY7I}GDJ;yA=;C@0>eOf@eFV-T;A!7d46 K*dxCK`@aCqtP@KB literal 0 HcmV?d00001