Mercurial > repos > rliterman > csp2
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/fun/FindPath.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,134 @@ +package fun; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; + +import fileIO.TextFile; +import shared.Timer; + +public class FindPath { + + public static void main(String[] args){ + Timer t=new Timer(); + String start=args[0]; + String stop=args[1]; + String fname=args[2]; + + makeGraph(fname); + Path path; + if(!start.equals(stop)){ + path=findPath(map.get(start), map.get(stop)); + }else{ + path=new Path(new Node(start)); + } + printPath(path); + t.stop(); + System.out.println("Time: \t"+t); + } + + private static Path findPath(Node start, Node stop) { + HashMap<Node, Path> pmap=new HashMap<Node, Path>(); + pmap.put(start, new Path(start)); + LinkedHashSet<Node> seen=new LinkedHashSet<Node>(); + seen.add(start); + + while(seen.size()>0){ + LinkedHashSet<Node> seen2=new LinkedHashSet<Node>(); + for(Node n : seen){ + Path current=pmap.get(n); + for(Edge e : n.edges){ + Path p=pmap.get(e.b); + if(p==null || p.dist>current.dist+e.dist){ + p=current.copy(); + p.add(e); + pmap.put(e.b, p); + seen2.add(e.b); + } + } + } + seen=seen2; + } + return pmap.get(stop); + } + + private static void printPath(Path path) { + if(path==null){ + System.out.println("Unreachable."); + return; + } + String comma=""; + for(Node n : path.list){ + System.out.print(comma+n.name); + comma=","; + } + System.out.println(" \t"+path.dist); + } + + static void makeGraph(String fname){ + map=new HashMap<String, Node>(); + TextFile tf=new TextFile(fname); + String line=tf.nextLine(); + while(line!=null){ + String[] split=line.split("\t"); + Node a=fetch(split[0]), b=fetch(split[1]); + int dist=Integer.parseInt(split[2]); + a.edges.add(new Edge(a, b, dist)); + b.edges.add(new Edge(b, a, dist)); + line=tf.nextLine(); + } + } + + static Node fetch(String s){ + Node n=map.get(s); + if(n==null){ + n=new Node(s); + map.put(s, n); + } + return n; + } + + static HashMap<String, Node> map; + + static class Node{ + + Node(String s){ + name=s; + } + String name; + ArrayList<Edge> edges=new ArrayList<Edge>(); + + } + + static class Edge{ + Edge(Node a_, Node b_, int dist_){ + a=a_; + b=b_; + dist=dist_; + } + Node a, b; + int dist; + } + + static class Path{ + Path(Node start){ + list.add(start); + } + private Path() { + // TODO Auto-generated constructor stub + } + public void add(Edge e){ + list.add(e.b); + dist+=e.dist; + } + public Path copy(){ + Path p=new Path(); + p.list.addAll(list); + p.dist=dist; + return p; + } + public ArrayList<Node> list=new ArrayList<Node>(); + public int dist=0; + } + +}