Witam, potrzebuje napisać program który wygeneruje mi graf (nie musi być spójny) nieskierowany o N wierzchołkach, w którym z każdego wierzchołka wychodzi dokładnie M krawędzi.
Rozpisałem sobie to w ten sposób:
Tworzę pusty graf np. tablica NxN.
Każdy wierzchołek posiada licznik wychodzących od niego krawędzi (początkowo wyzerowana). tablica[N]
No i w pętli dla każdego wierzchołka sprawdzam, czy posiada mniej niż M krawędzi, jeśli tak to losuje drugi wierzchołek z którym ma być połączony. Jeśli wylosowany wierzchołek ma mniej niż M krawędzi wtedy wpisuje do grafu połączenie między nimi i pętla leci dalej. Sprawdzane jest również, czy wylosowany wierzchołek nie został już wylosowany wcześniej.
Niestety program się zapętla w nieskończoność, nie wiem jaki warunek musi zostać spełniony, aby zakończyło program. Teoretycznie jeżeli mam np. 20 wierzchołków i z każdego ma wychodzić 4 połączenia to łącznie powinno być 80 połączeń. Jako, że graf jest nieskierowany więc krawędzi będzie 40. Zatem program powinien zakończyć generowanie grafu, gdy wylosuje 40 krawędzi. Niestety program nie działa tak jak chce, i losuje dla niektórych wierzchołków mniej niż 4 krawędzie. Kod który napisałem wygląda następująco:
#include <iostream>
#include <windows.h>
#include <time.h>
int main(int argc, char* argv[])
{
const int V = 20;
const int E = 4;
srand(time(NULL));
int graph[V][V];
for(int i=0; i<V; i++)
for(int j=0; j<V; j++)
graph[i][j]=0;
int filled[V];
for(int i=0; i<V; i++)
filled[i] = 0;
int r,c,t,count=0;
bool b;
for(int i=0; i<V; i++)
{
while(filled[i] < E && count < 40)
{
r = rand()%V;
b = true;
for(int j=0; j<filled[i]; j++)
if(r == graph[i][j])
b=false;
if(b==true)
if(filled[r] < E)
{
graph[i][r] = graph[r][i] = 1;
count++;
filled[i]++;
filled[r]++;
}
}
}
for(int i=0; i<V; i++)
{
for(int j=0; j<V; j++)
{
std::cout << graph[i][j];
}
std::cout << std::endl;
}
}