Проверка существования ребра на неориентированном графе с использованием библиотеки графов лимонов

0

Пример графа:

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 узла (если он существует).

Теги:
graph
lemon-graph-library

2 ответа

1

Вы можете хранить ваши узлы в массиве 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;
0

В случае, если кто-то (как я) ищет это, у 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; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню