关于迪杰斯特拉算法(最短路)的PHP实现

 
<?php
class dijistra
{
 public $inf=0x7fffffff;//最开始把不同的边赋值无限大
 public $MaxV=10000;//最大点数
 public $N,$M;
 public $froms;
 public $tos;
 public $ws;
 public $dist=array();
 public $path=array();
 public $p=array();
 public $map=array();
 
 function dijkstra($s)
 {
  for($i=0;$i<=$this->N;$i++)//对于每个点,设置为没访问过,和设置距离
  {
   $this->p[$i]=false;
   $this->dist[$i]=$this->map[$s][$i];
   $this->path[$i]=$s;
  }
  /*设置出入点的参数*/
  $this->dist[$s]=0;
  $this->path[$s]=$s;
  $this->p[$s]=true;
  
  for($i=1;$i<=$this->N;$i++)//开始扫点
  {
   $min=$this->inf;
   $k=0;
   for($j=1;$j<=$this->N;$j++)
   {
    if(!$this->p[$j]&&$this->dist[$j]<$min)
    {
     $min=$this->dist[$j];
     $k=$j;
    }
   }
   
   if($k == 0)
   {
    print_r("bu tong <br>");
    return;
   }
   
   $this->p[$k]=true;
   
   for($j=1;$j<=$this->N;$j++)
   {
    if(!$this->p[$j]&&$this->map[$k][$j]!=$this->inf
    &&$this->dist[$j]>$this->dist[$k]+$this->map[$k][$j])
    {
     $this->dist[$j]=$this->dist[$k]+$this->map[$k][$j];
     $this->path[$j]=$k;
    }
   }
  }
 }
 
 function init()
 {
  for($i=0;$i<=$this->N;$i++)//初始化将每两个点之间的边权先赋为无穷大
  {
   for($j=0;$j<=$this->N;$j++)
   {
    if($i==$j) $this->map[$i][$j]=0;
    else $this->map[$i][$j]=$this->inf;
   }   
  }
  for($i=0;$i<$this->M;$i++)//对于给出的两点的边权,更换成边权
  {
   $frompre=$this->froms[$i];
   $topre=$this->tos[$i];
   $valuepre=$this->ws[$i];
   
   $this->map[$frompre][$topre]
   =$this->map[$topre][$frompre]
   =$valuepre;
  }
 }
 
 function main($N,$M,$froms,$tos,$ws)
 {
  $this->N=$N;
  $this->M=$M;
  $this->froms=$froms;
  $this->tos=$tos;
  $this->ws=$ws;
  $this->init();//初始化
  $this->dijkstra(1);
  for($i=1;$i<=$this->N;$i++)
  {
   echo "dist[".$i."]   =   ".$this->dist[$i]."<br>";
  }
 }
} 
?>
<?php
$N=4;//点的个数
$M=4;//边的个数
$froms=array('1','1','2','1');//边开始点
$tos=array('2','3','3','4');//边到达点
$ws=array('3','4','0','2');//边权
$d = new dijistra();
$d->main($N,$M,$froms,$tos,$ws);
?>


转载于:https://my.oschina.net/MrHou/blog/143896

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值