home *** CD-ROM | disk | FTP | other *** search
- package
- {
- public class Dijkstra
- {
-
-
- private var startNode:int = 0;
-
- private var numberOfNodes:int;
-
- private var nodesLeft:Array;
-
- private var previousNode:Array;
-
- private var h:int;
-
- private var infiniteDistance:int = 100000;
-
- private var bestPath:int;
-
- private var visited:Array;
-
- private var distance:Array;
-
- private var endNode:int;
-
- private var w:int;
-
- private var aDecimal:Array;
-
- public function Dijkstra(param1:Array, param2:int, param3:int)
- {
- startNode = 0;
- infiniteDistance = 100000;
- super();
- this.w = param2;
- this.h = param3;
- this.aDecimal = param1;
- numberOfNodes = param2 * param3;
- endNode = numberOfNodes - 1;
- distance = new Array();
- previousNode = new Array();
- visited = new Array();
- bestPath = 0;
- nodesLeft = new Array();
- }
-
- private function nodesNotVisited(param1:Array) : Array
- {
- var _loc2_:* = undefined;
- var _loc3_:* = undefined;
- _loc2_ = new Array();
- _loc3_ = 0;
- while(_loc3_ < numberOfNodes)
- {
- if(!param1[_loc3_])
- {
- _loc2_.push(_loc3_);
- }
- _loc3_++;
- }
- return _loc2_;
- }
-
- private function findBestPath(param1:Array, param2:Array) : Number
- {
- var _loc3_:* = undefined;
- var _loc4_:* = undefined;
- var _loc5_:* = undefined;
- _loc3_ = infiniteDistance;
- _loc4_ = 0;
- _loc5_ = 0;
- while(_loc5_ < param2.length)
- {
- if(param1[param2[_loc5_]] < _loc3_)
- {
- _loc3_ = param1[param2[_loc5_]];
- _loc4_ = param2[_loc5_];
- }
- _loc5_++;
- }
- return _loc4_;
- }
-
- private function updateDistanceAndPrevious(param1:Number) : void
- {
- var _loc2_:* = undefined;
- var _loc3_:int = 0;
- var _loc4_:int = 0;
- var _loc5_:int = 0;
- var _loc6_:int = 0;
- _loc2_ = 0;
- while(_loc2_ < 4)
- {
- _loc4_ = infiniteDistance;
- _loc5_ = param1 % w;
- _loc6_ = param1 / w;
- switch(_loc2_)
- {
- case 0:
- _loc3_ = param1 - w;
- if(_loc6_ > 0)
- {
- _loc4_ = Math.abs(aDecimal[param1 - w] - aDecimal[param1]);
- }
- break;
- case 1:
- _loc3_ = param1 + 1;
- if(_loc5_ < w - 1)
- {
- _loc4_ = Math.abs(aDecimal[param1 + 1] - aDecimal[param1]);
- }
- break;
- case 2:
- _loc3_ = param1 + w;
- if(_loc6_ < h - 1)
- {
- _loc4_ = Math.abs(aDecimal[param1 + w] - aDecimal[param1]);
- }
- break;
- case 3:
- _loc3_ = param1 - 1;
- if(_loc5_ > 0)
- {
- _loc4_ = Math.abs(aDecimal[param1 - 1] - aDecimal[param1]);
- }
- break;
- }
- if(distance[param1] + _loc4_ < distance[_loc3_])
- {
- distance[_loc3_] = distance[param1] + _loc4_;
- previousNode[_loc3_] = param1;
- }
- _loc2_++;
- }
- }
-
- private function getResults() : int
- {
- var _loc1_:* = undefined;
- var _loc2_:* = undefined;
- var _loc3_:* = undefined;
- var _loc4_:* = undefined;
- _loc1_ = new Array();
- _loc2_ = endNode;
- _loc1_[_loc2_] = new Array();
- _loc3_ = null;
- _loc4_ = _loc2_;
- _loc1_[_loc2_].push(_loc2_);
- while(_loc3_ != this.startNode)
- {
- _loc1_[_loc2_].push(this.previousNode[_loc4_]);
- _loc3_ = this.previousNode[_loc4_];
- _loc4_ = this.previousNode[_loc4_];
- }
- _loc1_[_loc2_].reverse();
- trace("---------------------------------------");
- trace("The shortest distance from the startNode: " + startNode + ", to node " + _loc2_ + ": is -> " + distance[_loc2_]);
- trace("The shortest path from the startNode: " + startNode + ", to node " + _loc2_ + ": is -> " + _loc1_[_loc2_]);
- trace("---------------------------------------");
- return distance[_loc2_];
- }
-
- public function findShortestPath() : int
- {
- var _loc1_:* = undefined;
- _loc1_ = 0;
- while(_loc1_ < numberOfNodes)
- {
- visited[_loc1_] = 0;
- distance[_loc1_] = infiniteDistance;
- previousNode[_loc1_] = 0;
- _loc1_++;
- }
- visited[0] = 1;
- distance[0] = 0;
- distance[1] = aDecimal[1] - aDecimal[0];
- distance[w] = aDecimal[w] - aDecimal[0];
- while(somethingLeft(visited))
- {
- nodesLeft = nodesNotVisited(visited);
- bestPath = findBestPath(distance,nodesLeft);
- updateDistanceAndPrevious(bestPath);
- visited[bestPath] = 1;
- }
- return getResults();
- }
-
- private function somethingLeft(param1:Array) : Boolean
- {
- var _loc2_:* = undefined;
- _loc2_ = numberOfNodes - 1;
- while(_loc2_ > 0)
- {
- if(!param1[_loc2_])
- {
- return true;
- }
- _loc2_--;
- }
- return false;
- }
- }
- }
-