diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..217af47
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/description.html b/.idea/description.html
new file mode 100644
index 0000000..db5f129
--- /dev/null
+++ b/.idea/description.html
@@ -0,0 +1 @@
+Simple Java application that includes a class with main()
method
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..97626ba
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..2fcefcc
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..0843ceb
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Zavrsni_DFSiBFS.iml b/Zavrsni_DFSiBFS.iml
new file mode 100644
index 0000000..d5c0743
--- /dev/null
+++ b/Zavrsni_DFSiBFS.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/A_Star.java b/src/A_Star.java
new file mode 100644
index 0000000..311d230
--- /dev/null
+++ b/src/A_Star.java
@@ -0,0 +1,2 @@
+public abstract class A_Star extends GraphSearchAlgorithm{
+}
diff --git a/src/BFS.java b/src/BFS.java
new file mode 100644
index 0000000..8299f9a
--- /dev/null
+++ b/src/BFS.java
@@ -0,0 +1,18 @@
+import java.util.*;
+
+public class BFS extends GraphSearchAlgorithm{
+
+ @Override
+ AbstractCollection initOpen() {
+ return new LinkedList<>();
+ }
+
+ @Override
+ Node nextNode(AbstractCollection open) throws Exception {
+ if(open instanceof Queue) {
+ return ((Queue)open).remove();
+ } else{
+ throw new Exception("Krivog tipa je open");
+ }
+ }
+}
diff --git a/src/DFS.java b/src/DFS.java
new file mode 100644
index 0000000..cda5f38
--- /dev/null
+++ b/src/DFS.java
@@ -0,0 +1,19 @@
+import java.util.AbstractCollection;
+import java.util.Stack;
+
+public class DFS extends GraphSearchAlgorithm{
+
+ @Override
+ AbstractCollection initOpen() {
+ return new Stack<>();
+ }
+
+ @Override
+ Node nextNode(AbstractCollection open) throws Exception {
+ if(open instanceof Stack) {
+ return ((Stack)open).pop();
+ } else{
+ throw new Exception("Krivog tipa je open");
+ }
+ }
+}
diff --git a/src/GraphSearchAlgorithm.java b/src/GraphSearchAlgorithm.java
new file mode 100644
index 0000000..7680c03
--- /dev/null
+++ b/src/GraphSearchAlgorithm.java
@@ -0,0 +1,32 @@
+import java.util.*;
+
+abstract class GraphSearchAlgorithm {
+
+ public List run(Node s0, SearchProblem problem) throws Exception {
+ Node node = s0;
+ AbstractCollection open = initOpen();
+ open.add(node);
+ Set closed = new HashSet<>();
+ while(! open.isEmpty()){
+ node = nextNode(open);
+ if(problem.isGoalState(node)){
+ return node.path();
+ }
+ if(!closed.contains(node)){
+ closed.add(node);
+ Map succ = problem.successors(node);
+ for(Node m : succ.keySet()){
+ //if(m.getCost() == null || m.getCost() > node.getCost() + succ.get(m)){
+ m.setCost(node.getCost() + succ.get(m));
+ open.add(m);
+ }
+ }
+ }
+ return null;
+ }
+
+ abstract AbstractCollection initOpen();
+
+ abstract Node nextNode(AbstractCollection open) throws Exception;
+
+}
diff --git a/src/Main.java b/src/Main.java
new file mode 100644
index 0000000..8ba065e
--- /dev/null
+++ b/src/Main.java
@@ -0,0 +1,7 @@
+public class Main {
+
+ public static void main(String[] args) {
+ Problem[] problems = Reader.getProblems();
+
+ }
+}
diff --git a/src/Node.java b/src/Node.java
new file mode 100644
index 0000000..ae3eb9e
--- /dev/null
+++ b/src/Node.java
@@ -0,0 +1,52 @@
+import java.util.LinkedList;
+import java.util.List;
+
+class Node {
+
+ private String name;
+ private Node parent;
+ private boolean isRootNode;
+ private Double cost;
+
+ public Node(String name, Node parent, boolean isRootNode){
+ this.name = name;
+ this.parent = parent;
+ this.isRootNode = isRootNode;
+ }
+
+ List path() {
+ List list;
+ if(isRootNode) {
+ list = new LinkedList<>();
+ } else {
+ list = parent.path();
+ }
+ list.add(0, this);
+ return list;
+ }
+
+ public boolean isRootNode() {
+ return isRootNode;
+ }
+
+ public Node getParent() {
+ return parent;
+ }
+
+ public String getName(){
+ return name;
+ }
+
+ public void setCost(Double cost){
+ this.cost = cost;
+ }
+
+ public Double getCost(){
+ return cost;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/src/Problem.java b/src/Problem.java
new file mode 100644
index 0000000..cadf99e
--- /dev/null
+++ b/src/Problem.java
@@ -0,0 +1,21 @@
+import java.util.List;
+import java.util.Map;
+
+class Problem {
+
+ Map> successors;
+
+ Problem(Map> successors){
+ this.successors = successors;
+ }
+
+ boolean isGoalState(Node n) {
+ return n.isRootNode();
+ }
+
+ Map successors(Node n) {
+ return successors.get(n);
+ }
+ //!!!!pospremaj svako stanje jednom u memoriju za svaki par stanje-roditelj, da se moze koristiti path()
+ //da vrati put do stanja
+}
diff --git a/src/Reader.java b/src/Reader.java
new file mode 100644
index 0000000..4d6c791
--- /dev/null
+++ b/src/Reader.java
@@ -0,0 +1,5 @@
+class Reader {
+ static Problem[] getProblems(){
+ return null;
+ }
+}
diff --git a/src/SearchProblem.java b/src/SearchProblem.java
new file mode 100644
index 0000000..f6baff2
--- /dev/null
+++ b/src/SearchProblem.java
@@ -0,0 +1,9 @@
+import java.util.List;
+import java.util.Map;
+
+class SearchProblem extends Problem {
+
+ SearchProblem(Map> successors) {
+ super(successors);
+ }
+}