import java.util.* ;
/**
* Created by Shubham on 8/23/2016.
*/
class BellmanFordImpl {
class Edge {
private int src, dest, weight;
Edge( int v, int w, int val) {
this .src = v;
this .dest = w;
this .weight = val;
}
}
private int V;
private int E;
private LinkedList [ ] adj
; //Graph representation using adjacency list private boolean [ ] onQueue; //Maininging a queue for verticies whose distTo[] have not changed.
private LinkedList< Integer> queue;
private int [ ] distTo; //Distance to vertex from source
private int [ ] edgeTo; //Vertex pointing to this vertex in the shortest path found yet
BellmanFordImpl( int v) {
this .V = v;
this .E = 0 ;
for ( int i= 0 ; i< V; i++ ) {
adj[ i] = new LinkedList< Edge> ( ) ;
}
this .onQueue = new boolean [ V] ;
this .queue = new LinkedList< Integer> ( ) ;
this .distTo = new int [ V] ;
this .edgeTo = new int [ V] ;
}
private void addEdge( int v, int w, int weight) {
Edge e = new Edge( v, w, weight) ;
adj[ v] .add ( e) ;
}
private Iterable< Edge> adj( int v) {
return adj[ v] ;
}
private void findShortestPath( int src) {
queue.add ( src) ;
distTo[ src] = 0 ;
edgeTo[ src] = - 1 ;
while ( ! queue.isEmpty ( ) ) {
int v = queue.poll ( ) ;
onQueue[ v] = false ;
for ( Edge e : adj( v) ) {
int w = e.dest ;
if ( distTo[ w] > distTo[ v] + e.weight ) {
distTo[ w] = distTo[ v] + e.weight ;
edgeTo[ w] = v;
}
if ( ! onQueue[ w] ) {
onQueue[ w] = true ;
queue.add ( w) ;
}
}
}
}
private boolean hasPathTo( int v) {
return distTo
[ v
] < Integer .
MAX_VALUE ; }
private Stack< Integer> pathTo( int v) {
Stack< Integer> st = new Stack< Integer> ( ) ;
for ( int i = v; i != - 1 ; i = edgeTo[ i] ) {
st.push ( i) ;
}
return st;
}
private void printShortestPath( int src) {
System .
out .
println ( "The shortest path for source " + src
+ " is :" ) ; for ( int i= 0 ; i< V; i++ ) {
if ( hasPathTo( i) ) {
System .
out .
println ( "\n Shortest path from source " + src
+ " to " + i
+ " is : " + distTo
[ i
] ) ; Stack< Integer> st = pathTo( i) ;
while ( ! st.isEmpty ( ) ) {
int val = st.pop ( ) ;
if ( st.isEmpty ( ) ) {
} else {
System .
out .
printf ( val
+ "->" ) ; }
}
}
}
}
private void findPath( int src) {
findShortestPath( src) ;
printShortestPath( src) ;
}
public static void main
( String [ ] args
) { BellmanFordImpl bf = new BellmanFordImpl( 5 ) ;
bf.addEdge ( 0 ,1 ,- 1 ) ;
bf.addEdge ( 0 ,2 ,4 ) ;
bf.addEdge ( 1 ,2 ,3 ) ;
bf.addEdge ( 1 ,3 ,2 ) ;
bf.addEdge ( 1 ,4 ,2 ) ;
bf.addEdge ( 3 ,1 ,1 ) ;
bf.addEdge ( 3 ,2 ,5 ) ;
bf.addEdge ( 4 ,3 ,- 3 ) ;
BellmanFordImpl bf2 = new BellmanFordImpl( 5 ) ;
bf2.addEdge ( 0 ,1 ,1 ) ;
bf2.addEdge ( 1 ,2 ,1 ) ;
bf2.addEdge ( 2 ,3 ,1 ) ;
bf2.addEdge ( 3 ,4 ,1 ) ;
bf2.addEdge ( 0 ,3 ,5 ) ;
bf2.findPath ( 0 ) ;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKLyoqCiAqIENyZWF0ZWQgYnkgU2h1YmhhbSBvbiA4LzIzLzIwMTYuCiAqLwpjbGFzcyBCZWxsbWFuRm9yZEltcGwgewoKICAgIGNsYXNzIEVkZ2UgewogICAgICAgIHByaXZhdGUgaW50IHNyYywgZGVzdCwgd2VpZ2h0OwoKICAgICAgICBFZGdlKGludCB2LCBpbnQgdywgaW50IHZhbCkgewogICAgICAgICAgICB0aGlzLnNyYyA9IHY7CiAgICAgICAgICAgIHRoaXMuZGVzdCA9IHc7CiAgICAgICAgICAgIHRoaXMud2VpZ2h0ID0gdmFsOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGludCBWOwogICAgcHJpdmF0ZSBpbnQgRTsKICAgIHByaXZhdGUgTGlua2VkTGlzdFtdIGFkajsgICAvL0dyYXBoIHJlcHJlc2VudGF0aW9uIHVzaW5nIGFkamFjZW5jeSBsaXN0CiAgICBwcml2YXRlIGJvb2xlYW5bXSBvblF1ZXVlOyAgLy9NYWluaW5naW5nIGEgcXVldWUgZm9yIHZlcnRpY2llcyB3aG9zZSBkaXN0VG9bXSBoYXZlIG5vdCBjaGFuZ2VkLgogICAgcHJpdmF0ZSBMaW5rZWRMaXN0PEludGVnZXI+IHF1ZXVlOwogICAgcHJpdmF0ZSBpbnRbXSBkaXN0VG87ICAgLy9EaXN0YW5jZSB0byB2ZXJ0ZXggZnJvbSBzb3VyY2UKICAgIHByaXZhdGUgaW50W10gZWRnZVRvOyAgIC8vVmVydGV4IHBvaW50aW5nIHRvIHRoaXMgdmVydGV4IGluIHRoZSBzaG9ydGVzdCBwYXRoIGZvdW5kIHlldAoKICAgIEJlbGxtYW5Gb3JkSW1wbChpbnQgdikgewogICAgICAgIHRoaXMuViA9IHY7CiAgICAgICAgdGhpcy5FID0gMDsKICAgICAgICB0aGlzLmFkaiA9IG5ldyBMaW5rZWRMaXN0W1ZdOwogICAgICAgIGZvciAoaW50IGk9MDtpPFY7aSsrKSB7CiAgICAgICAgICAgIGFkaltpXSA9IG5ldyBMaW5rZWRMaXN0PEVkZ2U+KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMub25RdWV1ZSA9IG5ldyBib29sZWFuW1ZdOwogICAgICAgIHRoaXMucXVldWUgPSBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpOwogICAgICAgIHRoaXMuZGlzdFRvID0gbmV3IGludFtWXTsKICAgICAgICBBcnJheXMuZmlsbChkaXN0VG8sIEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICAgICB0aGlzLmVkZ2VUbyA9IG5ldyBpbnRbVl07CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGFkZEVkZ2UoaW50IHYsIGludCB3LCBpbnQgd2VpZ2h0KSB7CiAgICAgICAgRWRnZSBlID0gbmV3IEVkZ2Uodiwgdywgd2VpZ2h0KTsKICAgICAgICBhZGpbdl0uYWRkKGUpOwogICAgfQoKICAgIHByaXZhdGUgSXRlcmFibGU8RWRnZT4gYWRqKGludCB2KSB7CiAgICAgICAgcmV0dXJuIGFkalt2XTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZmluZFNob3J0ZXN0UGF0aChpbnQgc3JjKSB7CiAgICAgICAgcXVldWUuYWRkKHNyYyk7CiAgICAgICAgZGlzdFRvW3NyY10gPSAwOwogICAgICAgIGVkZ2VUb1tzcmNdID0gLTE7CiAgICAgICAgd2hpbGUgKCFxdWV1ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgaW50IHYgPSBxdWV1ZS5wb2xsKCk7CiAgICAgICAgICAgIG9uUXVldWVbdl0gPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChFZGdlIGUgOiBhZGoodikpewogICAgICAgICAgICAgICAgaW50IHcgPSBlLmRlc3Q7CiAgICAgICAgICAgICAgICBpZiAoZGlzdFRvW3ddID4gZGlzdFRvW3ZdICsgZS53ZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICBkaXN0VG9bd10gPSBkaXN0VG9bdl0gKyBlLndlaWdodDsKICAgICAgICAgICAgICAgICAgICBlZGdlVG9bd10gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFvblF1ZXVlW3ddKSB7CiAgICAgICAgICAgICAgICAgICAgb25RdWV1ZVt3XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKHcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQYXRoVG8oaW50IHYpIHsKICAgICAgICByZXR1cm4gZGlzdFRvW3ZdIDwgSW50ZWdlci5NQVhfVkFMVUU7CiAgICB9CgogICAgcHJpdmF0ZSBTdGFjazxJbnRlZ2VyPiBwYXRoVG8oaW50IHYpIHsKICAgICAgICBTdGFjazxJbnRlZ2VyPiBzdCA9IG5ldyBTdGFjazxJbnRlZ2VyPigpOwogICAgICAgIGZvciAoaW50IGkgPSB2OyBpICE9IC0xOyBpID0gZWRnZVRvW2ldKSB7CiAgICAgICAgICAgIHN0LnB1c2goaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRTaG9ydGVzdFBhdGgoaW50IHNyYykgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHNob3J0ZXN0IHBhdGggZm9yIHNvdXJjZSAiICsgc3JjICsgIiBpcyA6Iik7CiAgICAgICAgZm9yIChpbnQgaT0wOyBpPFY7IGkrKykgewogICAgICAgICAgICBpZiAoaGFzUGF0aFRvKGkpKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2hvcnRlc3QgcGF0aCBmcm9tIHNvdXJjZSAiICsgc3JjICsgIiB0byAiICsgaSArICIgaXMgOiAiICsgZGlzdFRvW2ldKTsKICAgICAgICAgICAgICAgIFN0YWNrPEludGVnZXI+IHN0ID0gcGF0aFRvKGkpOwogICAgICAgICAgICAgICAgd2hpbGUgKCFzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdmFsID0gc3QucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zih2YWwgKyAiIik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYodmFsICsgIi0+Iik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBmaW5kUGF0aChpbnQgc3JjKSB7CiAgICAgICAgZmluZFNob3J0ZXN0UGF0aChzcmMpOwogICAgICAgIHByaW50U2hvcnRlc3RQYXRoKHNyYyk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIEJlbGxtYW5Gb3JkSW1wbCBiZiA9IG5ldyBCZWxsbWFuRm9yZEltcGwoNSk7CiAgICAgICAgYmYuYWRkRWRnZSgwLDEsLTEpOwogICAgICAgIGJmLmFkZEVkZ2UoMCwyLDQpOwogICAgICAgIGJmLmFkZEVkZ2UoMSwyLDMpOwogICAgICAgIGJmLmFkZEVkZ2UoMSwzLDIpOwogICAgICAgIGJmLmFkZEVkZ2UoMSw0LDIpOwogICAgICAgIGJmLmFkZEVkZ2UoMywxLDEpOwogICAgICAgIGJmLmFkZEVkZ2UoMywyLDUpOwogICAgICAgIGJmLmFkZEVkZ2UoNCwzLC0zKTsKCiAgICAgICAgQmVsbG1hbkZvcmRJbXBsIGJmMiA9IG5ldyBCZWxsbWFuRm9yZEltcGwoNSk7CiAgICAgICAgYmYyLmFkZEVkZ2UoMCwxLDEpOwogICAgICAgIGJmMi5hZGRFZGdlKDEsMiwxKTsKICAgICAgICBiZjIuYWRkRWRnZSgyLDMsMSk7CiAgICAgICAgYmYyLmFkZEVkZ2UoMyw0LDEpOwogICAgICAgIGJmMi5hZGRFZGdlKDAsMyw1KTsKICAgICAgICBiZjIuZmluZFBhdGgoMCk7CiAgICB9Cn0=