Я хочу создать случайную матрицу смежности, в которой каждый узел соединен с «k» другими узлами. Граф, представленный матрицей смежности, неориентирован.
Я начал с 7 узлов в матрице смежности, и каждый узел должен быть связан как минимум с 3 другими узлами. До сих пор я смог получить это:
0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0
Как видно из матрицы, первая и последняя строки имеют менее трех соединений.
Моя реализация до сих пор:
for( int i= 0; i<7; i++){
for( int j= i+1; j<7; j++){
if (i==j){
topo[i][j]=0;
}
else{
for(int k=j; k<i+3 && k<7; k++){
int connectivity=0;
while(connectivity<3){
if (topo[i][k]!=1 && topo[k][i]!=1){
topo[i][k]=1;
topo[k][i]=1;
connectivity++;
}
else{
connectivity++;
}
}
}
}
}
}
Подумайте: какой диапазон значений k
будет иметь первый раз (с i
== 0 и j
== 1)?
Я предполагаю, что мы говорим здесь об ориентированных графах.
Предположим, что v
— это количество вершин (узлов), а d
вершины A
(степень, Ваш k
) — это количество ребер, которые утоплены из A
в другие узлы.
Если приглядеться, то можно обнаружить, что d
значение k-th
узла — это число 1
в kth
строке. Поэтому единственное, что нужно сделать, это нарисовать вектор из 0s
и 1s
с элементами v-1
(мы не соединяем узел сам с собой) элементов для каждой строки.
Вы можете нарисовать случайный вектор из нулей и единиц, написав в него d
единицы и случайным образом переставив его.
Примечание для неориентированного графа. Этот алгоритм можно применить к верхнему правому матричному треугольнику, динамически переписывая известные значения в нижний левый. Затем для каждой строки сверху вниз можно применить алгоритм, рисующий остаток строки.
Я немного смущен. В вашем названии указано «не менее 7», затем в вопросе указано «ровно 7», а позже в вопросе указано «не менее 3». К какому из них вы стремитесь?