package com.interview.algorithms.dp;
import com.interview.basics.model.graph.WeightedGraph;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created_By: stefanie
* Date: 14-9-18
* Time: 下午11:04
*/
public class C12_4_GraphShortestPathPOSNEG {
static class Result{
double weight = Integer.MAX_VALUE;
List<Integer> path = new ArrayList<Integer>();
}
public static Result find(WeightedGraph graph, int s, int t){
double[] opt = new double[graph.V];
int[] edges = new int[graph.V];
for(int i = 0; i < graph.V; i++) opt[i] = Integer.MAX_VALUE;
opt[s] = 0.0;
Set<Integer> queue = new HashSet<Integer>();
queue.add(s);
while(!queue.isEmpty()){
Integer node = queue.iterator().next();
queue.remove(node);
for(WeightedGraph.Edge edge : graph.adj(node)){
double ten = opt[edge.s] + edge.w;
if(ten < opt[edge.t]){
opt[edge.t] = ten;
edges[edge.t] = edge.s;
queue.add(edge.t);
}
}
}
Result result = new Result();
result.weight = opt[t];
while(t != s){
result.path.add(t);
t = edges[t];
}
result.path.add(s);
return result;
}
}