dijkstra算法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=$this->dist[$j];

$k=$j;

}

}

if($k == 0)

{

print_r("bu tong 
");

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;$iM;$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]."
";

}

}

}

?>

$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);

?>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值