单源点最短路径
2009-05-02 16:53
127 查看
public class BBShortest {
public static float[][] a={
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE},
{Float.MAX_VALUE, Float.MAX_VALUE, 10 , Float.MAX_VALUE, 30 , 100},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, 50, Float.MAX_VALUE, Float.MAX_VALUE},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, 10},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, 20, Float.MAX_VALUE, 60},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE}
};
public static int[] display = new int[6];
public static float[] dist = new float[6];
public static int[] p = new int[6];
/**
* @param a //图G的邻接矩阵
* @param display 用来打印运算结果
* @param dist 存入v(i,j)和最短路径
* @param p 记录最短路径的有顶点信息
*/
public static void main (String[] args) {
BBShortest shortest = new BBShortest();
shortest.shortest(1,dist,p);
shortest.display(5);
}
public BBShortest() {
}
/**
*@category display(int n):显示顶点v到顶点n的最短路径的长度,和走法
*/
public void display(int n){
System.out.println("到顶点" + n + "的最短路径长度是:" + dist
);
System.out.print("最短路径是:");
display[1] = p
;//把目标点的前驱给display[1]
int i;
for( i = 2;display[i - 1] != 1 && i <= 5;i++)
display[i] = p[display[i - 1]];
for(int j = 5;j > 0;j--){
if(display[j] != 0)
System.out.print(display[j] + " ");
}
System.out.println(n);
}
public static void shortest(int v,float[] dist,int[] p){
int n = p.length - 1;
MinHeap heap = new MinHeap();
//定义源为初始扩展结点
HeapNode enode = new HeapNode(v,0);
for(int j = 1;j <= n;j++)
dist[j] = Float.MAX_VALUE;
dist[v] = 0;
while(true){
//搜索问题的解空间
for(int j = 1;j <= n;j++)
if(a[enode.i][j] < Float.MAX_VALUE &&
enode.length + a[enode.i][j] < dist[j]){
//顶点I到J可达,且满足控制约束
dist[j] = enode.length + a[enode.i][j];
p[j] = enode.i;
HeapNode node = new HeapNode(j,dist[j]);
//向最小堆中插入活结点优先队列
heap.insert(node);
}
if(heap.isEmpty())
break;
else enode = (HeapNode)heap.removeMin();
}
}
}
class MinHeap {
/**
*@param HeapNode[] Heap 存放最小堆元素的数组
*@param int maxSize 最小堆最多允许元素个数
*@param int currentSize 最小堆当前元素个数
*/
HeapNode[] Heap;
int maxSize;
int currentSize;
public MinHeap() {
maxSize = 15;
Heap = new HeapNode[maxSize];
currentSize = 0;
}
public MinHeap(int n){
maxSize = 15 < n ? n : 15;
Heap=new HeapNode[maxSize];
currentSize=0;
}
public MinHeap(HeapNode[] heap,int n){
maxSize = 15 < n ? n : 15;
Heap=heap;
currentSize=n;
buildHeap();
}
public int heapSize(){
return currentSize;
}
public boolean isLeaf(int pos){
return (pos >= currentSize / 2)&&(pos < currentSize);
}
public int leftChild(int pos){
if(pos >= currentSize / 2){
System.out.println("the position has no leftchild");
return 0;
}
else return 2 * pos + 1;
}
public int rightChild(int pos){
if(pos >= (currentSize - 1) / 2){
System.out.println("the position has no rightchild");
return 0;
}
else return 2 * pos + 2;
}
public int parent(int pos){
if(pos <= 0){
System.out.print("the position has no parent");
return 0;
}
else return (pos -1) / 2;
}
public void buildHeap(){
for(int i = currentSize / 2;i >= 0;i--)
siftdown(i);
}
public void siftdown(int pos){
if(pos < 0 || pos >= currentSize)
System.out.println("illegal heap position");
else
while(!isLeaf(pos)){
int j=leftChild(pos);
if((j<(currentSize-1))&&(Heap[j].length>Heap[j+1].length))
j++;
if(Heap[pos].length<=Heap[j].length)return;
swap(Heap,pos,j);
pos=j;
}
}
public void swap(HeapNode[] heap,int pos,int j){
HeapNode temp=heap[pos];
heap[pos]=heap[j];
heap[j]=temp;
}
public void insert(HeapNode val){
int curr=currentSize++;
Heap[curr]=val;
while((curr!=0)&&(Heap[curr].length <HEAP[PARENT(CURR)].LENGTH)){ pre }< } false; return else true; 0) if(this.currentSize="=" isEmpty(){ boolean public Heap[currentSize]; siftdown(0); if(currentSize!="0)" swap(Heap,0,--currentSize); heap!?); empty the from System.out.println(?removing if(currentSize<="0)" removeMin(){ HeapNode curr="parent(curr);" swap(Heap,curr,parent(curr));>
<SCRIPT src="/inc/gg_read2.js"></SCRIPT>
class HeapNode {
int i;
float length;
public HeapNode(int ii,float ll) {
i = ii;
length = ll;
}
public int compareTo(Object x){
float xl = ((HeapNode)x).length;
if(length < xl)
return -1;
if(length == xl)
return 0;
return 1;
}
}
public static float[][] a={
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE},
{Float.MAX_VALUE, Float.MAX_VALUE, 10 , Float.MAX_VALUE, 30 , 100},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, 50, Float.MAX_VALUE, Float.MAX_VALUE},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, 10},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, 20, Float.MAX_VALUE, 60},
{Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE}
};
public static int[] display = new int[6];
public static float[] dist = new float[6];
public static int[] p = new int[6];
/**
* @param a //图G的邻接矩阵
* @param display 用来打印运算结果
* @param dist 存入v(i,j)和最短路径
* @param p 记录最短路径的有顶点信息
*/
public static void main (String[] args) {
BBShortest shortest = new BBShortest();
shortest.shortest(1,dist,p);
shortest.display(5);
}
public BBShortest() {
}
/**
*@category display(int n):显示顶点v到顶点n的最短路径的长度,和走法
*/
public void display(int n){
System.out.println("到顶点" + n + "的最短路径长度是:" + dist
);
System.out.print("最短路径是:");
display[1] = p
;//把目标点的前驱给display[1]
int i;
for( i = 2;display[i - 1] != 1 && i <= 5;i++)
display[i] = p[display[i - 1]];
for(int j = 5;j > 0;j--){
if(display[j] != 0)
System.out.print(display[j] + " ");
}
System.out.println(n);
}
public static void shortest(int v,float[] dist,int[] p){
int n = p.length - 1;
MinHeap heap = new MinHeap();
//定义源为初始扩展结点
HeapNode enode = new HeapNode(v,0);
for(int j = 1;j <= n;j++)
dist[j] = Float.MAX_VALUE;
dist[v] = 0;
while(true){
//搜索问题的解空间
for(int j = 1;j <= n;j++)
if(a[enode.i][j] < Float.MAX_VALUE &&
enode.length + a[enode.i][j] < dist[j]){
//顶点I到J可达,且满足控制约束
dist[j] = enode.length + a[enode.i][j];
p[j] = enode.i;
HeapNode node = new HeapNode(j,dist[j]);
//向最小堆中插入活结点优先队列
heap.insert(node);
}
if(heap.isEmpty())
break;
else enode = (HeapNode)heap.removeMin();
}
}
}
class MinHeap {
/**
*@param HeapNode[] Heap 存放最小堆元素的数组
*@param int maxSize 最小堆最多允许元素个数
*@param int currentSize 最小堆当前元素个数
*/
HeapNode[] Heap;
int maxSize;
int currentSize;
public MinHeap() {
maxSize = 15;
Heap = new HeapNode[maxSize];
currentSize = 0;
}
public MinHeap(int n){
maxSize = 15 < n ? n : 15;
Heap=new HeapNode[maxSize];
currentSize=0;
}
public MinHeap(HeapNode[] heap,int n){
maxSize = 15 < n ? n : 15;
Heap=heap;
currentSize=n;
buildHeap();
}
public int heapSize(){
return currentSize;
}
public boolean isLeaf(int pos){
return (pos >= currentSize / 2)&&(pos < currentSize);
}
public int leftChild(int pos){
if(pos >= currentSize / 2){
System.out.println("the position has no leftchild");
return 0;
}
else return 2 * pos + 1;
}
public int rightChild(int pos){
if(pos >= (currentSize - 1) / 2){
System.out.println("the position has no rightchild");
return 0;
}
else return 2 * pos + 2;
}
public int parent(int pos){
if(pos <= 0){
System.out.print("the position has no parent");
return 0;
}
else return (pos -1) / 2;
}
public void buildHeap(){
for(int i = currentSize / 2;i >= 0;i--)
siftdown(i);
}
public void siftdown(int pos){
if(pos < 0 || pos >= currentSize)
System.out.println("illegal heap position");
else
while(!isLeaf(pos)){
int j=leftChild(pos);
if((j<(currentSize-1))&&(Heap[j].length>Heap[j+1].length))
j++;
if(Heap[pos].length<=Heap[j].length)return;
swap(Heap,pos,j);
pos=j;
}
}
public void swap(HeapNode[] heap,int pos,int j){
HeapNode temp=heap[pos];
heap[pos]=heap[j];
heap[j]=temp;
}
public void insert(HeapNode val){
int curr=currentSize++;
Heap[curr]=val;
while((curr!=0)&&(Heap[curr].length <HEAP[PARENT(CURR)].LENGTH)){ pre }< } false; return else true; 0) if(this.currentSize="=" isEmpty(){ boolean public Heap[currentSize]; siftdown(0); if(currentSize!="0)" swap(Heap,0,--currentSize); heap!?); empty the from System.out.println(?removing if(currentSize<="0)" removeMin(){ HeapNode curr="parent(curr);" swap(Heap,curr,parent(curr));>
<SCRIPT src="/inc/gg_read2.js"></SCRIPT>
class HeapNode {
int i;
float length;
public HeapNode(int ii,float ll) {
i = ii;
length = ll;
}
public int compareTo(Object x){
float xl = ((HeapNode)x).length;
if(length < xl)
return -1;
if(length == xl)
return 0;
return 1;
}
}
相关文章推荐
- 算法长度K最短路问题(单源点最短路径+A*算法)Strut2教程-java教程
- Dijkstra算法--有向图的源点到其他顶点的最短路径(连接矩阵、邻接矩阵两种方式)
- POJ 2449 Remmarguts' Date K最短路问题(单源点最短路径+A*算法)
- 单源点最短路径的Dijkstra算法
- 单源点最短路径算法(dijkstra)
- K最短路问题(单源点最短路径+A*算法)
- Bellman-ford算法 实现源点最短路径 允许路径中有负权值
- 单源最短路径(一样有点贪心的感觉,n-1次循环,不断进行更新源点到其它各点距离)
- 最短路径(Dijkstra算法)也就是单源点问题!
- 单源点最短路径--2
- 单源点最短路径问题(Dijkstra算法)
- 单源点最短路径Dijkstra算法的JAVA实现
- 单源点最短路径Dijkstra方法实现
- 单源点最短路径----Dijkstra算法
- GraphX中Pregel单源点最短路径
- 单源点最短路径算法的设计与实现
- GraphX中Pregel单源点最短路径(转)
- 单源点最短路径Bellman算法实现
- 单源点最短路径 c++实现 分支限界算法
- 单源点最短路径