Извлечение ребер вершин нечетной степени в графе

#c #matrix #graph-theory

Вопрос:

У меня есть следующий график, представленный матрицей смежности MyCustomVectorlt;MyCustomVectorlt;intgt;gt; graph :

 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  1 0 1 1 INF INF INF INF INF INF INF INF INF INF INF INF 2 1 0 1 1 1 INF INF INF INF INF INF INF INF INF INF 3 1 1 0 INF INF 1 INF INF INF INF INF INF INF INF INF 4 INF 1 INF 0 1 INF INF INF 1 INF INF INF INF INF INF 5 INF 1 INF 1 0 1 INF INF INF 1 1 INF INF INF INF 6 INF INF 1 INF 1 0 1 INF 1 1 INF 1 INF INF INF 7 INF INF INF INF INF 1 0 1 INF INF INF INF 1 1 1 8 INF INF INF INF INF INF 1 0 INF INF INF INF INF INF 1 9 INF INF INF 1 INF 1 INF INF 0 INF INF INF INF INF INF 10 INF INF INF INF 1 1 INF INF INF 0 INF INF INF INF INF 11 INF INF INF INF 1 INF INF INF INF INF 0 1 INF INF INF 12 INF INF INF INF INF 1 INF INF INF INF 1 0 INF INF INF 13 INF INF INF INF INF INF 1 INF INF INF INF INF 0 1 INF 14 INF INF INF INF INF INF 1 INF INF INF INF INF 1 0 1 15 INF INF INF INF INF INF 1 1 INF INF INF INF INF 1 0  

Крайний левый и самый верхний столбец и строка просто представляют # узел. Я думал, что это легче увидеть. Все ребра неориентированы и имеют вес один. INF указывает, что узлы A и B не имеют общего сингулярного ребра.

Я могу вычислить все вершины нечетной степени, которые находятся { 3 4 5 7 14 15 } и содержатся в векторе, который у меня есть MyCustomVectorlt;intgt; oddVertices . Что я хочу сделать, так это построить подграф этого графика только с этими вершинами и их ребрами, так что что-то вроде этого.

 0 3 4 5 7 14 15  3 0 INF INF INF INF INF 4 INF 0 1 INF INF INF 5 INF 1 0 INF INF INF 7 INF INF INF 0 1 1  14 INF INF INF 1 0 1  15 INF INF INF 1 1 0  

Чтобы я мог запустить алгоритм Флойда Уоршалла на этом графике и получить

 0 3 4 5 7 14 15  3 0 2 2 2 3 3 4 2 0 1 3 4 4 5 2 1 0 2 1 1 7 2 3 2 0 1 1  14 3 4 3 1 0 1  15 3 4 3 1 1 0  

У меня возникли проблемы с управлением матрицей смежности и захватом столбцов, которые мне нужны. По сути, то, что я хочу сделать, это

  1. Выполните итерацию по графику
  2. Обратите внимание, что узел, на котором мы сейчас находимся, содержится в oddVertices
  3. Добавьте другие узлы, которые содержатся в oddVertices .

Я не могу использовать какую-либо другую структуру данных , кроме MyCustomVector , и она имеет только базовые функции , такие как [] , size() , pop_back() и push_back() .

Комментарии:

1. каково число узлов и ребер в графике?

2. @arbitrary_A мой график просто имеет дело с узлами, помеченными из {1,…, n}. в этом случае n = 15. «1» в определенном [i][j] указывает на общее ребро между узлами i и j или в противном случае.

Ответ №1:

Просто извлеките строки и столбцы, соответствующие подмножеству индексов:

 using std::vector;  /* ** input: ** adjacency list adj ** subset of node indices v ** output: ** adj list of induced subgraph subadj */ vectorlt;vectorlt;intgt;gt; get_subgraph(vectorlt;vectorlt;intgt;gt; const amp;adj, vectorlt;intgt; const amp;v) {  vectorlt;vectorlt;intgt;gt; subadj(v.length(), vectorlt;intgt;(v.length()));  for (unsigned int i = 0; i lt; v.size();   i)  for (unsigned int j = 0; j lt; v.size();   j)  {  subadj[i][j] = adj[v[i]][v[j]];  }  return subadj; }