Пример графа:
ListDigraph G;
ListGraph::Node A = G.addNode();
ListGraph::Node B = G.addNode();
ListGraph::Node C = G.addNode();
ListGraph::Node D = G.addNode();
ListGraph::Edge AB = G.addEdge(A,B);
ListGraph::Edge AC = G.addEdge(A,C);
ListGraph::Edge AD = G.addEdge(A,D);
ListGraph::Edge BC = G.addEdge(B,C);
ListGraph::Edge BD = G.addEdge(B,C);
ListGraph::Edge CD = G.addEdge(C,D);
Мне нужен метод, который принимает, например, 2 узла (A и C) и возвращает идентификатор Edge, который соединяет эти 2 узла (если он существует).
Вы можете хранить ваши узлы в массиве 1D и ваших ребрах в 2D-массиве. То есть вместо узлов A, B, C и D имеется массив с Nodes[0]
через Nodes[3]
. Тогда ребро AB может быть сохранено как Edge[0][1]
. Вы просто храните ребра в качестве матрицы смежности. Затем вы можете найти идентификатор ребер, используя этот вызов: G.id(Edge[0][1])
. Если вы хотите проверить, существует ли ребро между этими двумя узлами, вам просто нужно проверить, что абсолютное значение идентификатора ребра меньше, чем общее количество ребер:
if (abs(G.id(Edge[0][1])) < numberOfEdges)
return true;
else
return false;
В случае, если кто-то (как я) ищет это, у Lemon есть findEdge()
. Вы могли бы сделать:
ListGraph G;
ListGraph::Node A = G.addNode();
ListGraph::Node B = G.addNode();
ListGraph::Node C = G.addNode();
ListGraph::Edge AB = G.addEdge(A, B);
ListGraph::Edge BC = G.addEdge(B, C);
ListGraph::Edge FoundEdge = findEdge(G,A,B); // edge
// print existence:
cout << "Does edge A-B exist? "
<< (FoundEdge!=INVALID ? "yes" : "no")
<< endl;