最短路径(java)


public class Path
{
 public static void main(String args[])
 {
  Path p=new Path(4,1);
  p.SetPathInfo();
     p.PrintPath();
     System.out.println();
     System.out.print("The Shortest Distance is: "+p.Distance[p.EndPosition]);
  
 }
 
 int length=6;                              //图中点的个数
 int[][] PathInfo={{-1,2,-1,-1,-1,9},       //边的信息数组
                   {2,-1,8,15,-1,6},
                      {-1,8,-1,1,7,-1},
                      {-1,15,1,-1,3,-1},
                      { -1,-1,7,3,-1,3},
                      { 9,6,-1,-1,3,-1}};      
 int StartPosition;                           //起始点
 int EndPosition;                             //终点
 int [] Distance=new int[length];            //起点的到各个点的最短长度
 int [] Flag=new int[length];                //状态标识
 int [] Pre=new int[length];                 //前驱数组
 int [] PathLine=new int[length];            //根据前驱数组取得节点路径
 
 // 构造函数初始化
 public Path(int start,int end)
 {
  StartPosition=start;
  EndPosition=end;
  for(int i=0;i<length;i++)
  {
   Pre[i]=StartPosition;
   PathLine[i]=-1;
  }
  Pre[StartPosition]=0;
  Distance[StartPosition]=0;
  Flag[StartPosition]=1;
 }
 
 // 求最短路径
 public void SetPathInfo()
 {
  for(int i=0;i<this.length;i++)
  {
   if(i!=StartPosition)
   this.Distance[i]=PathInfo[StartPosition][i];//取得起始点一行的信息
  }
  
  while(FlagArrayStatus())
  {
   int index=FindMinIndex();
   Flag[index]=1;
  for(int i=0;i<length;i++)
  {
   if(PathInfo[index][i]!=-1&&i!=StartPosition)
   {
    if(Distance[i]==-1)
    {
      Distance[i]=PathInfo[index][i]+Distance[index];
     Pre[i]=index;
     }
    if(Distance[i]!=-1&&(PathInfo[index][i]+Distance[index])<Distance[i])
      {
         Distance[i]=PathInfo[index][i]+Distance[index];
       Pre[i]=index;
      }
      
     }
    
   }
  }
 }
 
 // 找到Distance[]数组中当前有效的最小值的索引
 private int FindMinIndex()
 {
  int MinValue=1000;
  int MinIndex=0;
  for(int j=0;j<length;j++)
  {
   if(j!=StartPosition&&Distance[j]!=-1&&Distance[j]<MinValue&&Flag[j]!=1)
   {
    MinValue=Distance[j];
    MinIndex=j;
   }
  }
  return MinIndex;
 }
 
 // 检查Flag[] 数组是否全为1,若全为1则返回flase,否则返回true
 private boolean FlagArrayStatus()
 {
  boolean Status=false;
  for(int i=0;i<length;i++)
  {
   if(Flag[i]!=1)
   {
    Status=true;
    break;
   }
  }
  return Status;
 }
 
 // 打印路径
 public void PrintPath()
 {
  int pathpoint=EndPosition;
  int i=0;
  while(pathpoint!=StartPosition)
  {
   PathLine[i]=Pre[pathpoint];
   i++;
   pathpoint=Pre[pathpoint];
  }
  for(int j=length-1;j>=0;j--)
  {
   if(PathLine[j]!=-1)
   {
    System.out.print("Position"+PathLine[j]+"->");
    
   }
  }
  System.out.print("Psition"+EndPosition);
 }
 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值