Java解决算法-最短路径问题

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Iterator;

 

/**

 * title__贪心算法之图的最短路径问题made by 任辉 2010-10-27

 * 给出一张有向图,一个源点,一个汇点,用二维数组表示例如 array[i][j]就表示

 * 顶点i到顶点j,它的值就是ij的距离

 * 本程序默认源点1汇点6

 * 最终打印出从1点到其他点的最短路径

 */

public class Task8_13 {

 

    private HashSet<Integer> V;

    private HashSet<Integer> X;

    private HashSet<Integer> Y;

    private ArrayList<Integer> L;

    private int[][] table = new int[][] { { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 9, 4, 0, 0, 0 },

           { 0, 0, 0, 0, 12, 5, 0 }, { 0, 0, 4, 0, 0, 13, 0 },

           { 0, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 3, 0, 15 },

           { 0, 0, 0, 0, 0, 0, 0 } };

 

    /** 构造 */

    public Task8_13() {

       preInit();

       DIJKSTRA();

       printL();

       printtable();

       System.out.println("L:"+L+"/nV:"+V+"/nX:"+X+"/nY:"+Y);

    }

 

    /** 数据初始化 */

    public void preInit() {

       int[] v = { 1, 2, 3, 4, 5, 6 };

       V = new HashSet<Integer>();//存放顶点名称

       for (int i = 0; i < v.length; i++)

           V.add(v[i]);

       X = new HashSet<Integer>();

       X.add(1);//集合X存放源点1

       Y = new HashSet<Integer>(V);//集合Y初始化

       Y.remove(1);//Y = V -1

       L = new ArrayList<Integer>(7);

       for (int j = 0; j < 7; j++)

           L.add(Integer.MAX_VALUE);

       L.set(1, 0);

    }

 

 

 

    /** 算法DIJKSTRA */

    public void DIJKSTRA() {

 

       System.out.println("V.size():" + V.size());

       for (int y = 2; y <= V.size(); y++) {

           if (table[1][y] > 0)// 如果y相邻于1

              L.set(y, length(1, y));

           else

              L.set(y, Integer.MAX_VALUE);

       }

              for (int j = 1; j <= V.size() - 1; j++) {

                  int y = findTheMinInL();

                  X.add(y);

                  Y.remove(y);

                  for (int jj = 1; jj < table.length; jj++) {

                     if(table[y][jj]>0)

                     if (Y.contains(jj)

                            && ((L.get(y) + length(y, jj))< L.get(jj)))

                         L.set(jj, L.get(y) + length(y, jj));

                  }

              }

    }

 

    /** 返回L中最小的数的index */

    public int findTheMinInL() {

       Iterator<Integer> it = L.iterator();

       int temp = Integer.MAX_VALUE;

       while (it.hasNext()) {

           int its = it.next();

           if (Y.contains(L.indexOf(its)) && its <= temp)//错误发现前if (Y.contains(its) && its <= temp)

              //这句话是  :令yY,使得L[y]为最小

              temp = its;

       }

       return (L.indexOf(temp));

    }

 

    /** a,b两顶点的距离(最短) */

    public int length(int a, int b) {//根据table[][]查询并返回int长度

       if (table[a][b] > 0)

           return table[a][b];

       else

           return Integer.MAX_VALUE;

    }

 

    /** 打印图信息 */

    public void printtable() {

       System.out.println("");

       System.out.println("图的信息:");

       for (int i = 1; i < table.length; i++) {

           for (int j = 1; j < table.length; j++) {

              System.out.printf("%3d", table[i][j]);

           }

           System.out.print("/n");

       }

    }

 

    /** 打印各个顶点的最短路径信息 */

    public void printL() {

       System.out.println("各个顶点从1点出发的最短路径为:");

       for (int i = 1; i < L.size(); i++) {

           int temp = L.get(i);

           System.out.print(temp + "       ");

       }

    }

 

    /** mainBase */

    public static void main(String[] args) {

       new Task8_13();

    }

}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值