Fix search Eulerian path/loop if graph has separate nodes.

This commit is contained in:
Oleg Sh 2021-06-12 16:07:37 +02:00
parent d8ed01c438
commit 5076ba07c5
5 changed files with 41 additions and 12 deletions

View File

@ -154,13 +154,20 @@ function BaseAlgorithmEx(graph, app)
// inheritance.
BaseAlgorithmEx.prototype = Object.create(BaseAlgorithm.prototype);
BaseAlgorithmEx.prototype.CalculateAlgorithm = function(queryString, resultCallback)
BaseAlgorithmEx.prototype.CalculateAlgorithm = function(queryString, resultCallback, ignoreSeparateNodes = false)
{
if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
console.log(queryString);
var graph = this.graph;
var creator = new GraphMLCreater(graph.vertices, graph.edges);
var ignoreNodes = {};
if (ignoreSeparateNodes)
for (var i = 0; i < graph.vertices.length; i++)
if (!graph.HasConnectedNodes(graph.vertices[i]))
ignoreNodes[graph.vertices[i].id] = 1;
var creator = new GraphMLCreater(graph.vertices, graph.edges, ignoreNodes);
var pathObjects = [];
var properties = {};
var result = [];

View File

@ -99,6 +99,26 @@ Graph.prototype.DeleteVertex = function(vertexObject)
}
}
Graph.prototype.HasConnectedNodes = function(vertexObject)
{
var res = false;
var index = this.vertices.indexOf(vertexObject);
if (index > -1)
{
for (var i = 0; i < this.edges.length; i++)
{
if (this.edges[i].vertex1 == vertexObject || this.edges[i].vertex2 == vertexObject)
{
res = true;
break;
}
}
}
return res;
}
Graph.prototype.FindVertex = function(id)
{
var res = null;

View File

@ -4,10 +4,11 @@
*/
function GraphMLCreater(nodes, arcs)
function GraphMLCreater(nodes, arcs, ignoreNodes = {})
{
this.nodes = nodes;
this.arcs = arcs;
this.ignoreNodes = ignoreNodes;
}
@ -27,6 +28,7 @@ GraphMLCreater.prototype.GetXMLString = function()
for (var i = 0; i < this.nodes.length; i++)
{
if (!this.ignoreNodes.hasOwnProperty(this.nodes[i].id))
xmlBoby = xmlBoby + "<node id=\"" + this.nodes[i].id + "\"/>";
}
var hasDirected = false;

View File

@ -37,7 +37,7 @@ FindEulerianLoop.prototype.result = function(resultCallback)
this.CalculateAlgorithm("elloop=cgiInput&report=xml", function (pathObjects, properties, results)
{
self.resultCallback(pathObjects, properties, results);
});
}, true);
return true;
}

View File

@ -37,7 +37,7 @@ FindEulerianPath.prototype.result = function(resultCallback)
this.CalculateAlgorithm("elpath=cgiInput&report=xml", function (pathObjects, properties, results)
{
self.resultCallback(pathObjects, properties, results);
});
}, true);
return true;
}