полный пример на веб-странице решения @Ishtars, график - один из вопроса ... Кажется, он работает, а не тщательно его протестировал. Это гораздо более простое решение, чем я ожидал; -)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
function connection(name, endPoint) {
this.name = name;
this.endPoint = endPoint;
}
function node(name) {
this.name = name;
this.connections = [];
this.addConnection = function (conn) {
this.connections[this.connections.length] = conn;
}
}
function printPath(path) {
document.getElementById('output').innerHTML =
document.getElementById('output').innerHTML
+ path + '<br />';
}
function allPaths(path, node) {
if (node.name == "end") {
printPath(path + ',' + node.name);
return;
}
cycle = path.substring(path.lastIndexOf(node.name)) + ',' + node.name;
if (cycle.length > 1 && path.indexOf(cycle) > 0) {
return;
}
for (var i = 0; i < node.connections.length; i++) {
allPaths(path + ',' + node.name + ":" +
node.connections[i].name
,node.connections[i].endPoint);
}
}
var start = new node("start");
var a = new node("A");
var b = new node("B");
var c = new node("C");
var d = new node("D");
var e = new node("E");
var f = new node("F");
var g = new node("G");
var end = new node("end");
start.addConnection(new connection("1", a));
a.addConnection(new connection("1", b));
b.addConnection(new connection("1", c));
c.addConnection(new connection("1", d));
c.addConnection(new connection("2", f));
d.addConnection(new connection("1", end));
f.addConnection(new connection("1", e));
f.addConnection(new connection("2", d));
e.addConnection(new connection("1", b));
e.addConnection(new connection("2", g));
g.addConnection(new connection("1", a));
</script>
</head>
<body onload="javascript:allPaths('start', a)";>
<div id="output"></div>
</body>
</html>
и вот вывод (на всякий случай, если кто-то может обнаружить ошибку; -):
start,A:1,B:1,C:1,D:1,end
start,A:1,B:1,C:2,F:1,E:1,B:1,C:1,D:1,end
start,A:1,B:1,C:2,F:1,E:1,B:1,C:2,F:1,E:2,G:1,A:1,B:1,C:1,D:1,end
start,A:1,B:1,C:2,F:1,E:1,B:1,C:2,F:1,E:2,G:1,A:1,B:1,C:2,F:2,D:1,end
start,A:1,B:1,C:2,F:1,E:1,B:1,C:2,F:2,D:1,end
start,A:1,B:1,C:2,F:1,E:2,G:1,A:1,B:1,C:1,D:1,end
start,A:1,B:1,C:2,F:1,E:2,G:1,A:1,B:1,C:2,F:1,E:1,B:1,C:1,D:1,end
start,A:1,B:1,C:2,F:1,E:2,G:1,A:1,B:1,C:2,F:1,E:1,B:1,C:2,F:2,D:1,end
start,A:1,B:1,C:2,F:1,E:2,G:1,A:1,B:1,C:2,F:2,D:1,end
start,A:1,B:1,C:2,F:2,D:1,end
Полагаю, я не знал о jsFiddle, когда писал это, вот скрипка с приведенным выше кодом:
http://jsfiddle.net/6bWMp/1/