您的位置:首页 > 其它

单源点最短路径

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: