1- import Queue from "./basics/queue" ;
2- import Stack from "./basics/stack" ;
3- import Node from "./basics/node" ;
4- import MinHeap from "./heaps/minHeap" ;
5- import BHNode from "./heaps/bHNode" ;
1+ import Queue from ".. /basics/queue" ;
2+ import Stack from ".. /basics/stack" ;
3+ import Node from ".. /basics/node" ;
4+ import MinHeap from ".. /heaps/minHeap" ;
5+ import BHNode from ".. /heaps/bHNode" ;
66// import FibonacciHeap from "./heaps/fibonacciHeap";
77// import FHNode from "./heaps/fHNode";
8- import ListSet from "./disjoint-sets/listSet" ;
9- import ForestSet from "./disjoint-sets/forestSet" ;
8+ import ListSet from ".. /disjoint-sets/listSet" ;
9+ import ForestSet from ".. /disjoint-sets/forestSet" ;
1010import fs from "fs" ;
11+ import { Vertex , isWeighted } from "./vertex" ;
1112
1213// Returns a random number between [min,max)
1314const random = ( min : number , max : number ) => {
1415 return Math . floor ( Math . random ( ) * ( max - min ) ) + min ;
1516} ;
1617
17- interface Vertex < T > {
18- node : T ;
19- weight ?: number ;
20- }
21-
22- const isWeighted = < T > ( v : Vertex < T > ) => {
23- if ( v . weight ) return true ;
24- return false ;
25- } ;
26-
2718class Graph < T > {
2819 // list adj: Map(key,array of vertex)
2920 list : Map < T , Vertex < T > [ ] > ;
@@ -747,11 +738,14 @@ class Graph<T> {
747738 // Returns the distance from all pair of vertices (u,v) in V
748739 // negative costs are allowed
749740 // use parents (predecessor pointers) to traverse the cycle
750- // FIXME:
741+ // Also returns the last node used in set K
751742 floydWarshall = ( ) => {
752- let costs = new Map ( ) ;
743+ let costs = new Map < T , Map < T , Map < T , number > > > ( ) ;
753744 // predecessor pointers
754- const parents = new Map ( ) ;
745+ const parents = new Map < T , Map < T , T | null > > ( ) ;
746+ const keys = [ ...this . list . keys ( ) ] ;
747+ // last vertex in K
748+ let oldK = keys [ 0 ] ;
755749 // Initialize maps
756750 // i: starter vertex, j: target vertex
757751 // K: set of allowed vertex, k: last vertex in K
@@ -762,21 +756,17 @@ class Graph<T> {
762756 for ( let [ i ] of this . list ) {
763757 for ( let [ j ] of this . list ) {
764758 if ( ! costs . get ( i ) ) {
765- costs . set ( i , new Map ( ) ) ;
766- parents . set ( i , new Map ( ) ) ;
767- }
768- if ( ! costs . get ( i ) . get ( j ) ) {
769- costs . get ( i ) . set ( j , new Map ( ) ) ;
770- parents . get ( i ) . set ( j , new Map ( ) ) ;
759+ costs . set ( i , new Map < T , Map < T , number > > ( ) ) ;
760+ parents . set ( i , new Map < T , T | null > ( ) ) ;
771761 }
772- if ( ! costs . get ( i ) . get ( j ) . get ( i ) ) {
773- costs . get ( i ) . get ( j ) . set ( i , new Map ( ) ) ;
762+ if ( ! costs . get ( i ) ! . get ( j ) ) {
763+ costs . get ( i ) ! . set ( j , new Map < T , number > ( ) ) ;
774764 }
775765 if ( i === j ) {
776- costs . get ( i ) . get ( j ) . set ( i , 0 ) ;
777- parents . get ( i ) . set ( i , null ) ;
766+ costs . get ( i ) ! . get ( j ) ! . set ( oldK , 0 ) ;
767+ parents . get ( i ) ! . set ( i , null ) ;
778768 } else {
779- costs . get ( i ) . get ( j ) . set ( i , Infinity ) ;
769+ costs . get ( i ) ! . get ( j ) ! . set ( oldK , Infinity ) ;
780770 }
781771 }
782772 }
@@ -785,36 +775,29 @@ class Graph<T> {
785775 for ( let [ i , vertexList ] of this . list ) {
786776 for ( let neighbour in vertexList ) {
787777 const w = vertexList [ neighbour ] ;
788- costs . get ( i ) . get ( w . node ) . set ( i , w . weight ! ) ;
778+ costs . get ( i ) ! . get ( w . node ) ! . set ( oldK , w . weight ! ) ;
789779 }
790780 }
791- // FIXME: Use K set again
792- // let oldK = "0";
793781 // to expand K to the next vertex of this.list
794- for ( let [ k ] of this . list ) {
795- let oldK = k ;
782+ for ( let k of keys ) {
796783 for ( let [ i ] of this . list ) {
797784 for ( let [ j ] of this . list ) {
798- // to initialize a new map for this new set K
799- if ( ! costs . get ( i ) . get ( j ) . get ( k ) ) {
800- costs . get ( i ) . get ( j ) . set ( k , new Map ( ) ) ;
801- }
802785 // min {path without new k (as intermediary), path i to k + path k to j}
803- const lastD = costs . get ( i ) . get ( j ) . get ( oldK ) ;
804- const d =
805- costs . get ( i ) . get ( k ) . get ( oldK ) + costs . get ( k ) . get ( j ) . get ( oldK ) ;
786+ const lastD = costs . get ( i ) ! . get ( j ) ! . get ( oldK ) ! ;
787+ const d : number =
788+ costs . get ( i ) ! . get ( k ) ! . get ( oldK ) ! + costs . get ( k ) ! . get ( j ) ! . get ( oldK ) ! ;
806789 if ( d < lastD ) {
807- costs . get ( i ) . get ( j ) . set ( k , d ) ;
808- parents . get ( i ) . set ( j , k ) ;
790+ costs . get ( i ) ! . get ( j ) ! . set ( k , d ) ;
791+ parents . get ( i ) ! . set ( j , k ) ;
809792 } else {
810- costs . get ( i ) . get ( j ) . set ( k , lastD ) ;
793+ costs . get ( i ) ! . get ( j ) ! . set ( k , lastD ) ;
811794 }
812795 }
813796 }
814797 // update oldK
815798 oldK = k ;
816799 }
817- return { costs, parents } ;
800+ return { costs, parents, oldK } ;
818801 } ;
819802
820803 // TODO: Johnson's Algorithm?
0 commit comments