- Notifications
You must be signed in to change notification settings - Fork41
Package provides javascript implementation of algorithms for graph processing
License
chen0040/js-graph-algorithms
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Package provides javascript implementation of algorithms for graph processing
- Depth First Search (Link:HTML DEMO)
- Breadth First Search
- Connected Components for undirected graph (Link:HTML DEMO)
- Topoloical Sort (Link:HTML DEMO)
- Strongly Connected Components for directed graph (Link:HTML DEMO)
- Minimum Spanning Tree for weighted graph (Kruskal, Prim Lazy, Prim Eager) (Link:HTML DEMO)
- Shortest Paths (Dijkstra, Bellman-Ford, Topological Sort on DAG) (Link:HTML DEMO)
- MaxFlow-MinCut (Ford-Fulkerson) (Link:HTML DEMO)
npm install js-graph-algorithms
The sample code below shows how to create a undirected and unweighted graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.Graph(6);// 6 is the number vertices in the graphg.addEdge(0,5);// add undirected edge connecting vertex 0 to vertex 5g.addEdge(2,4);g.addEdge(2,3);g.addEdge(1,2);g.addEdge(0,1);g.addEdge(3,4);g.addEdge(3,5);g.addEdge(0,2);g.node(2).label='Hello';// assigned 'Hello' as label for node 2g.edge(0,2).label='World';// edge between 0 and 2console.log(g.V);// display 6, which is the number of vertices in gconsole.log(g.adj(0));// display [5, 1, 2], which is the adjacent list to vertex 0
The sample code below shows how to create a direted and unweighted graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.DiGraph(13);// 13 is the number vertices in the graphg.addEdge(4,2);// add directed edge from 4 to 2g.addEdge(2,3);g.addEdge(3,2);g.addEdge(6,0);g.addEdge(0,1);g.addEdge(2,0);g.addEdge(11,12);g.addEdge(12,9);g.addEdge(9,10);g.addEdge(9,11);g.addEdge(7,9);g.addEdge(10,12);g.addEdge(11,4);g.addEdge(4,3);g.addEdge(3,5);g.addEdge(6,8);g.addEdge(8,6);g.addEdge(5,4);g.addEdge(0,5);g.addEdge(6,4);g.addEdge(6,9);g.addEdge(7,6);g.node(2).label='Hello';// assign 'Hello' as label for node 2g.edge(0,5).label='World';// edge from 0 to 5console.log(g.V);// display 13, which is the number of vertices in gconsole.log(g.adj(0));// display the adjacency list which are vertices directed from vertex 0
The sample code below shows show to create undirected weighted graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedGraph(8);// 8 is the number vertices in the graphg.addEdge(newjsgraphs.Edge(0,7,0.16));g.addEdge(newjsgraphs.Edge(2,3,0.17));g.addEdge(newjsgraphs.Edge(1,7,0.19));g.addEdge(newjsgraphs.Edge(0,2,0.26));g.addEdge(newjsgraphs.Edge(5,7,0.28));g.addEdge(newjsgraphs.Edge(1,3,0.29));g.addEdge(newjsgraphs.Edge(1,5,0.32));g.addEdge(newjsgraphs.Edge(2,7,0.34));g.addEdge(newjsgraphs.Edge(4,5,0.35));g.addEdge(newjsgraphs.Edge(1,2,0.36));g.addEdge(newjsgraphs.Edge(4,7,0.37));g.addEdge(newjsgraphs.Edge(0,4,0.38));g.addEdge(newjsgraphs.Edge(6,2,0.4));g.addEdge(newjsgraphs.Edge(3,6,0.52));g.addEdge(newjsgraphs.Edge(6,0,0.58));g.addEdge(newjsgraphs.Edge(6,4,0.93));g.node(2).label='Hello';// assign 'Hello' as label for node 2g.edge(4,5).label='World';// edge between node 4 and 5console.log(g.V);// display 13, which is the number of vertices in gconsole.log(g.adj(0));// display the adjacency list which are undirected edges connected to vertex 0
The sample code below shows show to create directed weighted graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedDiGraph(8);// 8 is the number vertices in the graphg.addEdge(newjsgraphs.Edge(0,7,0.16));g.addEdge(newjsgraphs.Edge(2,3,0.17));g.addEdge(newjsgraphs.Edge(1,7,0.19));g.addEdge(newjsgraphs.Edge(0,2,0.26));g.addEdge(newjsgraphs.Edge(5,7,0.28));g.addEdge(newjsgraphs.Edge(1,3,0.29));g.addEdge(newjsgraphs.Edge(1,5,0.32));g.addEdge(newjsgraphs.Edge(2,7,0.34));g.addEdge(newjsgraphs.Edge(4,5,0.35));g.addEdge(newjsgraphs.Edge(1,2,0.36));g.addEdge(newjsgraphs.Edge(4,7,0.37));g.addEdge(newjsgraphs.Edge(0,4,0.38));g.addEdge(newjsgraphs.Edge(6,2,0.4));g.addEdge(newjsgraphs.Edge(3,6,0.52));g.addEdge(newjsgraphs.Edge(6,0,0.58));g.addEdge(newjsgraphs.Edge(6,4,0.93));g.node(2).label='Hello';g.edge(4,5).label='World';// edge from node 4 to node 5console.log(g.V);// display 13, which is the number of vertices in gconsole.log(g.adj(0));// display the adjacency list which are directed edges from vertex 0
The sample code below show how to perform depth first search of an undirected graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.Graph(6);g.addEdge(0,5);g.addEdge(2,4);g.addEdge(2,3);g.addEdge(1,2);g.addEdge(0,1);g.addEdge(3,4);g.addEdge(3,5);g.addEdge(0,2);vars=0;vardfs=newjsgraphs.DepthFirstSearch(g,s);for(varv=0;v<g.V;++v){if(dfs.hasPathTo(v)){console.log(s+" is connected to "+v);console.log("path: "+dfs.pathTo(v));}else{console.log('No path from '+s+' to '+v);}}
The sample code below show how to obtain the number of connected components in an undirected graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.Graph(13);g.addEdge(0,5);g.addEdge(4,3);g.addEdge(0,1);g.addEdge(9,12);g.addEdge(6,4);g.addEdge(5,4);g.addEdge(0,2);g.addEdge(11,12);g.addEdge(9,10);g.addEdge(0,6);g.addEdge(7,8);g.addEdge(9,11);g.addEdge(5,3);varcc=newjsgraphs.ConnectedComponents(g);console.log(cc.componentCount());// display 3for(varv=0;v<g.V;++v){console.log('id['+v+']: '+cc.componentId(v));}
The sample code below show how to obtain the reverse post order of a topological sort in a directed acyclic graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');vardag=newjsgraphs.DiGraph(7);// must be directed acyclic graphdag.addEdge(0,5);dag.addEdge(0,2);dag.addEdge(0,1);dag.addEdge(3,6);dag.addEdge(3,5);dag.addEdge(3,4);dag.addEdge(5,4);dag.addEdge(6,4);dag.addEdge(6,0);dag.addEdge(3,2);dag.addEdge(1,4);varts=newjsgraphs.TopologicalSort(dag);varorder=ts.order();console.log(order);// display array which is the topological sort order
The sample code below show how to obtain the strongly connected components from a directed graph (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');vargraph=newjsgraphs.DiGraph(13);graph.addEdge(4,2);graph.addEdge(2,3);graph.addEdge(3,2);graph.addEdge(6,0);graph.addEdge(0,1);graph.addEdge(2,0);graph.addEdge(11,12);graph.addEdge(12,9);graph.addEdge(9,10);graph.addEdge(9,11);graph.addEdge(8,9);graph.addEdge(10,12);graph.addEdge(11,4);graph.addEdge(4,3);graph.addEdge(3,5);graph.addEdge(7,8);graph.addEdge(8,7);graph.addEdge(5,4);graph.addEdge(0,5);graph.addEdge(6,4);graph.addEdge(6,9);graph.addEdge(7,6);varscc=newjsgraphs.StronglyConnectedComponents(graph);console.log(scc.componentCount());// display 5for(varv=0;v<graph.V;++v){console.log('id['+v+']: '+scc.componentId(v));}
The sample code below show how to obtain the minimum spanning tree from a weighted graph using Kruskal algorithm (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedGraph(8);g.addEdge(newjsgraphs.Edge(0,7,0.16));g.addEdge(newjsgraphs.Edge(2,3,0.17));g.addEdge(newjsgraphs.Edge(1,7,0.19));g.addEdge(newjsgraphs.Edge(0,2,0.26));g.addEdge(newjsgraphs.Edge(5,7,0.28));g.addEdge(newjsgraphs.Edge(1,3,0.29));g.addEdge(newjsgraphs.Edge(1,5,0.32));g.addEdge(newjsgraphs.Edge(2,7,0.34));g.addEdge(newjsgraphs.Edge(4,5,0.35));g.addEdge(newjsgraphs.Edge(1,2,0.36));g.addEdge(newjsgraphs.Edge(4,7,0.37));g.addEdge(newjsgraphs.Edge(0,4,0.38));g.addEdge(newjsgraphs.Edge(6,2,0.4));g.addEdge(newjsgraphs.Edge(3,6,0.52));g.addEdge(newjsgraphs.Edge(6,0,0.58));g.addEdge(newjsgraphs.Edge(6,4,0.93));varkruskal=newjsgraphs.KruskalMST(g);varmst=kruskal.mst;for(vari=0;i<mst.length;++i){vare=mst[i];varv=e.either();varw=e.other(v);console.log('('+v+', '+w+'): '+e.weight);}
The sample code below show how to obtain the minimum spanning tree from a weighted graph using Lazy Prim algorithm (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedGraph(8);g.addEdge(newjsgraphs.Edge(0,7,0.16));g.addEdge(newjsgraphs.Edge(2,3,0.17));g.addEdge(newjsgraphs.Edge(1,7,0.19));g.addEdge(newjsgraphs.Edge(0,2,0.26));g.addEdge(newjsgraphs.Edge(5,7,0.28));g.addEdge(newjsgraphs.Edge(1,3,0.29));g.addEdge(newjsgraphs.Edge(1,5,0.32));g.addEdge(newjsgraphs.Edge(2,7,0.34));g.addEdge(newjsgraphs.Edge(4,5,0.35));g.addEdge(newjsgraphs.Edge(1,2,0.36));g.addEdge(newjsgraphs.Edge(4,7,0.37));g.addEdge(newjsgraphs.Edge(0,4,0.38));g.addEdge(newjsgraphs.Edge(6,2,0.4));g.addEdge(newjsgraphs.Edge(3,6,0.52));g.addEdge(newjsgraphs.Edge(6,0,0.58));g.addEdge(newjsgraphs.Edge(6,4,0.93));varprim=newjsgraphs.LazyPrimMST(g);varmst=prim.mst;for(vari=0;i<mst.length;++i){vare=mst[i];varv=e.either();varw=e.other(v);console.log('('+v+', '+w+'): '+e.weight);}
The sample code below show how to obtain the minimum spanning tree from a weighted graph using Eager Prim algorithm (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedGraph(8);g.addEdge(newjsgraphs.Edge(0,7,0.16));g.addEdge(newjsgraphs.Edge(2,3,0.17));g.addEdge(newjsgraphs.Edge(1,7,0.19));g.addEdge(newjsgraphs.Edge(0,2,0.26));g.addEdge(newjsgraphs.Edge(5,7,0.28));g.addEdge(newjsgraphs.Edge(1,3,0.29));g.addEdge(newjsgraphs.Edge(1,5,0.32));g.addEdge(newjsgraphs.Edge(2,7,0.34));g.addEdge(newjsgraphs.Edge(4,5,0.35));g.addEdge(newjsgraphs.Edge(1,2,0.36));g.addEdge(newjsgraphs.Edge(4,7,0.37));g.addEdge(newjsgraphs.Edge(0,4,0.38));g.addEdge(newjsgraphs.Edge(6,2,0.4));g.addEdge(newjsgraphs.Edge(3,6,0.52));g.addEdge(newjsgraphs.Edge(6,0,0.58));g.addEdge(newjsgraphs.Edge(6,4,0.93));varprim=newjsgraphs.EagerPrimMST(g);varmst=prim.mst;for(vari=0;i<mst.length;++i){vare=mst[i];varv=e.either();varw=e.other(v);console.log('('+v+', '+w+'): '+e.weight);}
The sample code below show how to obtain the shortest paths from a starting point 0 on a weighted directed graph using Dijkstra (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedDiGraph(8);g.addEdge(newjsgraphs.Edge(0,1,5.0));g.addEdge(newjsgraphs.Edge(0,4,9.0));g.addEdge(newjsgraphs.Edge(0,7,8.0));g.addEdge(newjsgraphs.Edge(1,2,12.0));g.addEdge(newjsgraphs.Edge(1,3,15.0));g.addEdge(newjsgraphs.Edge(1,7,4.0));g.addEdge(newjsgraphs.Edge(2,3,3.0));g.addEdge(newjsgraphs.Edge(2,6,11.0));g.addEdge(newjsgraphs.Edge(3,6,9.0));g.addEdge(newjsgraphs.Edge(4,5,5.0));g.addEdge(newjsgraphs.Edge(4,6,20.0));g.addEdge(newjsgraphs.Edge(4,7,5.0));g.addEdge(newjsgraphs.Edge(5,2,1.0));g.addEdge(newjsgraphs.Edge(5,6,13.0));g.addEdge(newjsgraphs.Edge(7,5,6.0));g.addEdge(newjsgraphs.Edge(7,2,7.0));vardijkstra=newjsgraphs.Dijkstra(g,0);for(varv=1;v<g.V;++v){if(dijkstra.hasPathTo(v)){varpath=dijkstra.pathTo(v);console.log('=====path from 0 to '+v+' start==========');for(vari=0;i<path.length;++i){vare=path[i];console.log(e.from()+' => '+e.to()+': '+e.weight);}console.log('=====path from 0 to '+v+' end==========');console.log('=====distance: '+dijkstra.distanceTo(v)+'=========');}}
The sample code below show how to obtain the shortest paths from a starting point 0 on a weighted directed graph using Bellman-Ford:
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedDiGraph(8);g.addEdge(newjsgraphs.Edge(0,1,5.0));g.addEdge(newjsgraphs.Edge(0,4,9.0));g.addEdge(newjsgraphs.Edge(0,7,8.0));g.addEdge(newjsgraphs.Edge(1,2,12.0));g.addEdge(newjsgraphs.Edge(1,3,15.0));g.addEdge(newjsgraphs.Edge(1,7,4.0));g.addEdge(newjsgraphs.Edge(2,3,3.0));g.addEdge(newjsgraphs.Edge(2,6,11.0));g.addEdge(newjsgraphs.Edge(3,6,9.0));g.addEdge(newjsgraphs.Edge(4,5,5.0));g.addEdge(newjsgraphs.Edge(4,6,20.0));g.addEdge(newjsgraphs.Edge(4,7,5.0));g.addEdge(newjsgraphs.Edge(5,2,1.0));g.addEdge(newjsgraphs.Edge(5,6,13.0));g.addEdge(newjsgraphs.Edge(7,5,6.0));g.addEdge(newjsgraphs.Edge(7,2,7.0));varbf=newjsgraphs.BellmanFord(g,0);for(varv=1;v<g.V;++v){if(bf.hasPathTo(v)){varpath=bf.pathTo(v);console.log('=====path from 0 to '+v+' start==========');for(vari=0;i<path.length;++i){vare=path[i];console.log(e.from()+' => '+e.to()+': '+e.weight);}console.log('=====path from 0 to '+v+' end==========');console.log('=====distance: '+bf.distanceTo(v)+'=========');}}
The sample code below show how to obtain the shortest paths from a starting point 0 on a weighted directed acylic graph using Topological Sort:
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.WeightedDiGraph(8);g.addEdge(newjsgraphs.Edge(0,1,5.0));g.addEdge(newjsgraphs.Edge(0,4,9.0));g.addEdge(newjsgraphs.Edge(0,7,8.0));g.addEdge(newjsgraphs.Edge(1,2,12.0));g.addEdge(newjsgraphs.Edge(1,3,15.0));g.addEdge(newjsgraphs.Edge(1,7,4.0));g.addEdge(newjsgraphs.Edge(2,3,3.0));g.addEdge(newjsgraphs.Edge(2,6,11.0));g.addEdge(newjsgraphs.Edge(3,6,9.0));g.addEdge(newjsgraphs.Edge(4,5,5.0));g.addEdge(newjsgraphs.Edge(4,6,20.0));g.addEdge(newjsgraphs.Edge(4,7,5.0));g.addEdge(newjsgraphs.Edge(5,2,1.0));g.addEdge(newjsgraphs.Edge(5,6,13.0));g.addEdge(newjsgraphs.Edge(7,5,6.0));g.addEdge(newjsgraphs.Edge(7,2,7.0));varbf=newjsgraphs.TopologicalSortShortestPaths(g,0);for(varv=1;v<g.V;++v){if(bf.hasPathTo(v)){varpath=bf.pathTo(v);console.log('=====path from 0 to '+v+' start==========');for(vari=0;i<path.length;++i){vare=path[i];console.log(e.from()+' => '+e.to()+': '+e.weight);}console.log('=====path from 0 to '+v+' end==========');console.log('=====distance: '+bf.distanceTo(v)+'=========');}}
The sample code below show how to obtain the MaxFlow-MinCut of a directed weighted graph using ford-fulkerson algorithm (Link:HTML DEMO):
varjsgraphs=require('js-graph-algorithms');varg=newjsgraphs.FlowNetwork(8);g.addEdge(newjsgraphs.FlowEdge(0,1,10));g.addEdge(newjsgraphs.FlowEdge(0,2,5));g.addEdge(newjsgraphs.FlowEdge(0,3,15));g.addEdge(newjsgraphs.FlowEdge(1,4,9));g.addEdge(newjsgraphs.FlowEdge(1,5,15));g.addEdge(newjsgraphs.FlowEdge(1,2,4));g.addEdge(newjsgraphs.FlowEdge(2,5,8));g.addEdge(newjsgraphs.FlowEdge(2,3,4));g.addEdge(newjsgraphs.FlowEdge(3,6,16));g.addEdge(newjsgraphs.FlowEdge(4,5,15));g.addEdge(newjsgraphs.FlowEdge(4,7,10));g.addEdge(newjsgraphs.FlowEdge(5,7,10));g.addEdge(newjsgraphs.FlowEdge(5,6,15));g.addEdge(newjsgraphs.FlowEdge(6,2,6));g.addEdge(newjsgraphs.FlowEdge(6,7,10));g.node(2).label='Hello';g.edge(0,1).label='World';varsource=0;vartarget=7;varff=newjsgraphs.FordFulkerson(g,source,target);console.log('max-flow: '+ff.value);varminCut=ff.minCut(g);for(vari=0;i<minCut.length;++i){vare=minCut[i];console.log('min-cut: ('+e.from()+", "+e.to()+')');}
About
Package provides javascript implementation of algorithms for graph processing
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.