comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/fun/FindPath.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
comparison
equal deleted inserted replaced
67:0e9998148a16 68:5028fdace37b
1 package fun;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.LinkedHashSet;
6
7 import fileIO.TextFile;
8 import shared.Timer;
9
10 public class FindPath {
11
12 public static void main(String[] args){
13 Timer t=new Timer();
14 String start=args[0];
15 String stop=args[1];
16 String fname=args[2];
17
18 makeGraph(fname);
19 Path path;
20 if(!start.equals(stop)){
21 path=findPath(map.get(start), map.get(stop));
22 }else{
23 path=new Path(new Node(start));
24 }
25 printPath(path);
26 t.stop();
27 System.out.println("Time: \t"+t);
28 }
29
30 private static Path findPath(Node start, Node stop) {
31 HashMap<Node, Path> pmap=new HashMap<Node, Path>();
32 pmap.put(start, new Path(start));
33 LinkedHashSet<Node> seen=new LinkedHashSet<Node>();
34 seen.add(start);
35
36 while(seen.size()>0){
37 LinkedHashSet<Node> seen2=new LinkedHashSet<Node>();
38 for(Node n : seen){
39 Path current=pmap.get(n);
40 for(Edge e : n.edges){
41 Path p=pmap.get(e.b);
42 if(p==null || p.dist>current.dist+e.dist){
43 p=current.copy();
44 p.add(e);
45 pmap.put(e.b, p);
46 seen2.add(e.b);
47 }
48 }
49 }
50 seen=seen2;
51 }
52 return pmap.get(stop);
53 }
54
55 private static void printPath(Path path) {
56 if(path==null){
57 System.out.println("Unreachable.");
58 return;
59 }
60 String comma="";
61 for(Node n : path.list){
62 System.out.print(comma+n.name);
63 comma=",";
64 }
65 System.out.println(" \t"+path.dist);
66 }
67
68 static void makeGraph(String fname){
69 map=new HashMap<String, Node>();
70 TextFile tf=new TextFile(fname);
71 String line=tf.nextLine();
72 while(line!=null){
73 String[] split=line.split("\t");
74 Node a=fetch(split[0]), b=fetch(split[1]);
75 int dist=Integer.parseInt(split[2]);
76 a.edges.add(new Edge(a, b, dist));
77 b.edges.add(new Edge(b, a, dist));
78 line=tf.nextLine();
79 }
80 }
81
82 static Node fetch(String s){
83 Node n=map.get(s);
84 if(n==null){
85 n=new Node(s);
86 map.put(s, n);
87 }
88 return n;
89 }
90
91 static HashMap<String, Node> map;
92
93 static class Node{
94
95 Node(String s){
96 name=s;
97 }
98 String name;
99 ArrayList<Edge> edges=new ArrayList<Edge>();
100
101 }
102
103 static class Edge{
104 Edge(Node a_, Node b_, int dist_){
105 a=a_;
106 b=b_;
107 dist=dist_;
108 }
109 Node a, b;
110 int dist;
111 }
112
113 static class Path{
114 Path(Node start){
115 list.add(start);
116 }
117 private Path() {
118 // TODO Auto-generated constructor stub
119 }
120 public void add(Edge e){
121 list.add(e.b);
122 dist+=e.dist;
123 }
124 public Path copy(){
125 Path p=new Path();
126 p.list.addAll(list);
127 p.dist=dist;
128 return p;
129 }
130 public ArrayList<Node> list=new ArrayList<Node>();
131 public int dist=0;
132 }
133
134 }