Guest User

Untitled

a guest
Jul 19th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. [ { 1 }, { 2, 3 }, { 4 }, { 5, 6, 7 } ]
  2.  
  3. 1
  4. /
  5. /
  6. /
  7. 2 3
  8. | |
  9. 4 4
  10. /| /|
  11. 5 6 7 5 6 7
  12.  
  13. [ [ 1, 2, 4, 5 ], [ 1, 2, 4, 6 ], [ 1, 2, 4, 7 ], [ 1, 3, 4, 5 ], [ 1, 3, 4, 6 ], [ 1, 3, 4, 7 ] ]
  14.  
  15. /**
  16. * This returns the adjacent nodes to an integer node in the tree
  17. * @param node
  18. * @return a set of adjacent nodes, and null otherwise
  19. */
  20. public Set<Integer> getAdjacentsToNode(Integer node) {
  21.  
  22. for (int i = 0; i < tree.size(); i++) {
  23. Set<Integer> level = tree.get(i);
  24. if (level.contains(node) && i < tree.size() - 1) {
  25. return tree.get(i + 1);
  26. }
  27. }
  28. return null;
  29. }
  30.  
  31. /**
  32. * initializes our search, sets the root and adds it to the path
  33. */
  34. public void initialize() {
  35. root = -1;
  36. for (Integer node : tree.get(0)) {
  37. root = node;
  38. }
  39. currentPath.add(root);
  40. }
  41.  
  42. /**
  43. * runs a DFS on the tree to retrieve all paths
  44. * @param tree
  45. */
  46. public void runDFS(Integer node) {
  47. if (getAdjacentsToNode(node) != null) {
  48. for (Integer adjNode : getAdjacentsToNode(node)) {
  49. currentPath.add(adjNode);
  50. runDFS(adjNode);
  51. }
  52. currentPath.remove(currentPath.size() -1);
  53. } else {
  54. paths.add(currentPath.toArray(new Integer[0]));
  55. currentPath.remove(currentPath.size() -1);
  56. }
  57. }
  58.  
  59. import java.util.ArrayList;
  60. import java.util.Arrays;
  61. import java.util.HashSet;
  62. import java.util.List;
  63. import java.util.Set;
  64.  
  65. public class DFS {
  66. private List<Integer> currentPath = new ArrayList<Integer>();
  67. private List<Integer[]> paths = new ArrayList<Integer[]>();
  68. private ArrayList<Set<Integer>> tree;
  69. private Integer root;
  70. /**
  71. * constructor
  72. * @param tree
  73. */
  74. public DFS(ArrayList<Set<Integer>> tree) {
  75. this.tree = tree;
  76. }
  77.  
  78. public List<Integer[]> getPaths() {
  79. return paths;
  80. }
  81. public void setPaths(List<Integer[]> paths) {
  82. this.paths = paths;
  83. }
  84. public Integer getRoot() {
  85. return root;
  86. }
  87. public void setRoot(Integer root) {
  88. this.root = root;
  89. }
  90.  
  91. /**
  92. * initializes our search, sets the root and adds it to the path
  93. */
  94. public void initialize() {
  95. root = -1;
  96. for (Integer node : tree.get(0)) {
  97. root = node;
  98. }
  99. currentPath.add(root);
  100. }
  101.  
  102. /**
  103. * This returns the adjacent nodes to an integer node in the tree
  104. * @param node
  105. * @return a set of adjacent nodes, and null otherwise
  106. */
  107. public Set<Integer> getAdjacentsToNode(Integer node) {
  108.  
  109. for (int i = 0; i < tree.size(); i++) {
  110. Set<Integer> level = tree.get(i);
  111. if (level.contains(node) && i < tree.size() - 1) {
  112. return tree.get(i + 1);
  113. }
  114. }
  115. return null;
  116. }
  117.  
  118. /**
  119. * runs a DFS on the tree to retrieve all paths
  120. * @param tree
  121. */
  122. public void runDFS(Integer node) {
  123. if (getAdjacentsToNode(node) != null) {
  124. for (Integer adjNode : getAdjacentsToNode(node)) {
  125. currentPath.add(adjNode);
  126. runDFS(adjNode);
  127. }
  128. currentPath.remove(currentPath.size() -1);
  129. } else {
  130. paths.add(currentPath.toArray(new Integer[0]));
  131. currentPath.remove(currentPath.size() -1);
  132. }
  133. }
  134. }
  135.  
  136. public static void main(String[] args) {
  137. ArrayList<Set<Integer>> tree = new ArrayList<Set<Integer>>();
  138. Set<Integer> level1 = new HashSet<Integer>();
  139. level1.add(new Integer(1));
  140.  
  141. Set<Integer> level2 = new HashSet<Integer>();
  142. level2.add(new Integer(2));
  143. level2.add(new Integer(3));
  144.  
  145. Set<Integer> level3 = new HashSet<Integer>();
  146. level3.add(new Integer(4));
  147.  
  148. Set<Integer> level4 = new HashSet<Integer>();
  149. level4.add(new Integer(5));
  150. level4.add(new Integer(6));
  151. level4.add(new Integer(7));
  152.  
  153. tree.add(level1);
  154. tree.add(level2);
  155. tree.add(level3);
  156. tree.add(level4);
  157.  
  158. DFS dfsSearch = new DFS(tree);
  159. dfsSearch.initialize();
  160. dfsSearch.runDFS(dfsSearch.getRoot());
  161.  
  162. for (Integer[] path : dfsSearch.getPaths()) {
  163. System.out.println(Arrays.toString(path));
  164. }
  165.  
  166. [1, 2, 4, 5]
  167. [1, 2, 4, 6]
  168. [1, 2, 4, 7]
  169. [1, 3, 4, 5]
  170. [1, 3, 4, 6]
  171. [1, 3, 4, 7]
  172.  
  173. def getPaths(levels) {
  174. return getPaths(levels, 0, new Set()
  175. }
  176.  
  177. def getPaths(levels, currentIndex, paths) {
  178.  
  179. if(currentIndex == levels.length)
  180. return paths
  181.  
  182. def newPaths = new Set(paths)
  183.  
  184. for(path : paths) {
  185. for(level : levels) {
  186. newPaths.add( path + level )
  187. }
  188. }
  189.  
  190. return getPaths(levels, currentIndex + 1, newPaths)
  191.  
  192. }
  193.  
  194. public static List<Integer[]> getAllPaths(Set<Integer>[] tree){
  195.  
  196. // Get the overall number of path
  197. int totalSize = 1;
  198. for(Set<Integer> line : tree){
  199. totalSize *= line.size();
  200. }
  201.  
  202. // Create the empty paths
  203. List<Integer[]> allPaths = new ArrayList<Integer[]>(totalSize);
  204. for(int i = 0 ; i<totalSize ; ++i){
  205. Integer[] path = new Integer[tree.length];
  206. allPaths.add(path);
  207. }
  208.  
  209. // Fill the paths
  210. int indexLine = 0;
  211. for (Set<Integer> line : tree) {
  212. Iterator<Integer[]> pathIterator = allPaths.iterator();
  213. Iterator<Integer> lineIterator = line.iterator();
  214. while(pathIterator.hasNext()){
  215. if(!lineIterator.hasNext()){
  216. lineIterator = line.iterator();
  217. }
  218. pathIterator.next()[indexLine] = lineIterator.next();
  219. }
  220. ++indexLine;
  221. }
  222. return allPaths;
  223. }
  224.  
  225. public static void main(String[] args) {
  226.  
  227. Set<Integer> line1 = new HashSet<Integer>();
  228. line1.add(new Integer(1));
  229. Set<Integer> line2 = new HashSet<Integer>();
  230. line2.add(new Integer(2));
  231. line2.add(new Integer(3));
  232. Set<Integer> line3 = new HashSet<Integer>();
  233. line3.add(new Integer(4));
  234. Set<Integer> line4 = new HashSet<Integer>();
  235. line4.add(new Integer(5));
  236. line4.add(new Integer(6));
  237. line4.add(new Integer(7));
  238.  
  239. Set[] test = {line1, line2,line3,line4};
  240.  
  241. List<Integer[]> allPaths = getAllPaths(test);
  242.  
  243. for(Integer[] path : allPaths){
  244. System.out.println(Arrays.toString(path));
  245. }
  246. }
Add Comment
Please, Sign In to add comment