From 2e51e1b06ad6fa9aac518dbc57dda6e93cd61305 Mon Sep 17 00:00:00 2001 From: sergeynikitin Date: Wed, 21 Jul 2021 16:47:51 +0300 Subject: [PATCH 1/2] Create Graph --- .../BreadthFirstPath.java | 51 +++++++++++++++++++ .../DepthFirstPath.java | 44 ++++++++++++++++ src/algorithmsAndDataStructures/Graph.java | 44 ++++++++++++++++ src/algorithmsAndDataStructures/Main.java | 15 +++++- 4 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 src/algorithmsAndDataStructures/BreadthFirstPath.java create mode 100644 src/algorithmsAndDataStructures/DepthFirstPath.java create mode 100644 src/algorithmsAndDataStructures/Graph.java diff --git a/src/algorithmsAndDataStructures/BreadthFirstPath.java b/src/algorithmsAndDataStructures/BreadthFirstPath.java new file mode 100644 index 0000000..d26db60 --- /dev/null +++ b/src/algorithmsAndDataStructures/BreadthFirstPath.java @@ -0,0 +1,51 @@ +package algorithmsAndDataStructures; + +import java.util.LinkedList; + +public class BreadthFirstPath { + + private boolean[] marked; + private int[] edgTo; + private int source; + + public BreadthFirstPath(Graph graph, int source) { + this.source = source; + marked = new boolean[graph.getVertexCount()]; + edgTo = new int[graph.getVertexCount()]; + bfs(graph, source); + } + + private void bfs(Graph graph, int source) { + LinkedList queue = new LinkedList<>(); + queue.add(source); + marked[source] = true; + while (!queue.isEmpty()) { + int vertex = queue.removeFirst(); + for (int w : graph.getAdjLists(vertex)) { + if (!marked[w]) { + marked[w] = true; + edgTo[w] = vertex; + queue.addLast(w); + } + } + } + } + + + public boolean hasPathTo(int v) { + return marked[v]; + } + + public LinkedList pathTo(int v) { + if (!hasPathTo(v)) { + return null; + } + LinkedList stack = new LinkedList<>(); + int vertex = v; + while (vertex != source) { + stack.push(vertex); + vertex = edgTo[vertex]; + } + return stack; + } +} diff --git a/src/algorithmsAndDataStructures/DepthFirstPath.java b/src/algorithmsAndDataStructures/DepthFirstPath.java new file mode 100644 index 0000000..5e65039 --- /dev/null +++ b/src/algorithmsAndDataStructures/DepthFirstPath.java @@ -0,0 +1,44 @@ +package algorithmsAndDataStructures; + +import java.util.LinkedList; + +public class DepthFirstPath { + private boolean[] marked; + private int[] edgTo; + private int source; + + public DepthFirstPath(Graph graph, int source) { + this.source = source; + marked = new boolean[graph.getVertexCount()]; + edgTo = new int[graph.getVertexCount()]; + dfs(graph, source); + + } + + private void dfs(Graph graph, int v) { + marked[v] = true; + for (int w : graph.getAdjLists(v)) { + if (!marked[w]) { + edgTo[w] = v; + dfs(graph, w); + } + } + } + + public boolean hasPathTo(int v) { + return marked[v]; + } + + public LinkedList pathTo(int v){ + if (!hasPathTo(v)){ + return null; + } + LinkedListstack=new LinkedList<>(); + int vertex=v; + while (vertex!=source){ + stack.push(vertex); + vertex=edgTo[vertex]; + } + return stack; + } +} diff --git a/src/algorithmsAndDataStructures/Graph.java b/src/algorithmsAndDataStructures/Graph.java new file mode 100644 index 0000000..8ef0268 --- /dev/null +++ b/src/algorithmsAndDataStructures/Graph.java @@ -0,0 +1,44 @@ +package algorithmsAndDataStructures; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class Graph { + private int vertexCount; + private int edgeCount; + private LinkedList[] adjLists; + + public Graph(int vertexCount) { + if (vertexCount < 1) { + throw new IllegalArgumentException("vertexCount: " + vertexCount); + } + this.vertexCount = vertexCount; + adjLists = new LinkedList[vertexCount]; + for (int i = 0; i < adjLists.length; i++) { + adjLists[i] = new LinkedList<>(); + } + } + + public int getVertexCount() { + return vertexCount; + } + + public int getEdgeCount() { + return edgeCount; + } + + public List getAdjLists(int vertex) { + return Collections.unmodifiableList(adjLists[vertex]); + } + + public void addEdge(int v1, int v2) { + if (v1 < 0 || v2 < 0 || v1 > vertexCount || v2 > vertexCount) { + throw new IllegalArgumentException(""); + } + adjLists[v1].add(v2); + if (v1 != v2) { + adjLists[v2].add(v1); + } + } +} diff --git a/src/algorithmsAndDataStructures/Main.java b/src/algorithmsAndDataStructures/Main.java index ba454e2..ee3fc22 100644 --- a/src/algorithmsAndDataStructures/Main.java +++ b/src/algorithmsAndDataStructures/Main.java @@ -3,6 +3,19 @@ public class Main { public static void main(String[] args) { - // write your code here + Graph graph = new Graph(10); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(3, 4); + graph.addEdge(5, 6); + graph.addEdge(2, 5); + graph.addEdge(7, 6); + graph.addEdge(8, 1); + graph.addEdge(2, 9); + + BreadthFirstPath bfp = new BreadthFirstPath(graph, 1); + System.out.println(bfp.pathTo(7)); + + } } From eb8529b48f48ff1a12bfbcf4b0e0732c06443623 Mon Sep 17 00:00:00 2001 From: SerjNikitin <76908941+SerjNikitin@users.noreply.github.com> Date: Wed, 21 Jul 2021 16:49:19 +0300 Subject: [PATCH 2/2] Create README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5728af5 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# AlgorithmsAndDataStructures +1. Реализовать программу, в которой задается граф из 10 вершин. +Задать ребра и найти кратчайший путь с помощью поиска в ширину.