Generowanie grafu o zadanej spójności

0

Hej!

Chciałbym wygenerować graf o zadanej gęstości. Na początku użytkownik pytany jest o liczbę wierzchołków a potem o gęstość. Jak wiadomo gęstość grafu to liczba wygenerowanych krawędzi/liczba wszystkich możliwych krawędzi w grafie. I teraz załóżmy sytuację ze chcę wygenerować graf o 10 wierzchołkach gęstością 0,3. Wszystkich możliwych krawędzi mamy 45 a z taką gęstością będzie około 13 krawędzi. I jak teraz wygenerować to 13 losowych krawędzi z 45?

0
  1. Tablica Tb[1..45]
  2. W pętli dla każdego elementu Tb[i]=i;
  3. Pętla of 45 w dół, do 45-13+1 włącznie - zmienna X: wymień Tb[X] z Tb[ losowa w zakresie [1..X] ]
    W ostatnich 13 będziesz mieć wylosowane jednostajnie numery 13 z 45
0
 for(i=0;i<a;i++)
	{
		for(j=0;j<a;j++)
		{
			
			for(z=0;z<ileKraw;z++)
			{
				if(tab[z]==a*i+j+1)
					plik<<"1 ";
				plik<<"0 ";
			}
		}
		plik<<"\n";
	}

Tablica tab zawiera wylosowaną wcześniej liczbę krawędzi (długość tablicy) a poszczególne wartości tablicy są krawędziami(załóżmy ze tak jak dla omawianego przypadku mamy graf 10 wierzchołkowy, czyli łącznie krawędzi jest 45 i teraz losowanych jest 13 liczb z przedziału 1-45 i wstawiane do tablicy). Teraz chcę porównać czy dany element tablicy sąsiedztwa danego grafu nie powinien być 1(mamy tablicę sąsiedztwa 10 na 10 więc dowolny element można wyrazić przez a*i+j, gdzie a to liczba wierzchołków, i numer wiersza, j numer pozycji w wierszu) i teraz robię if(tab[z]==a*i+j+1) i w zależności od czy wartość tab jest równa(czy jest krawędź) wstawiamy 1 lub 0. Fragment kodu nie działa tak jakbym chciał, bo mamy tu sprawdzanie i zapisywanie do pliku za każdą iteracją a nie po całościowym sprawdzeniu czy dla danego indeksu tab istnieje krawędź. I powiem że się już pogubiłem i nie wiem jak to poprawić.

0

Jeżeli wygenerowałeś liczby wg algorytmu co podałem wyżej to wylosowane masz na końcu, zaś w tym co podałeś zakładasz że są na początku.
Więc przekopiuj je na początek.
Posortuj je.
Stwórz tablicę Tb[IleWezlow*IleWezlow], raczej dynamiczne.

for(p=n=y=0;y<IleWezlow;++y)
  {
   for(x=y+1;x<IleWezlow;++x,++p)
     {
      int v=(p==tab[n]) ;
      Tb[IleWezlow*y+x]=Tb[IleWezlow*x+y]=v;
      n+=v;
     }
  }
for(y=0;y<IleWezlow;++y,plik<<endl) for(x=0;x<IleWezlow;++x) plik<<Tb[IleWezlow*y+x]<<' ';

Nie zapomnij zwolnić tablicy.
Owszem da się to zrobić w jednym przebiegu, zaś kod będzie sporo dłuższy no i potrzebne do tego wyprowadzenie równań:
fx(NumerPolaczenia) - x w macierze sąsiedztwa
fy(NumerPolaczenia) - y w macierze sąsiedztwa

0

Ok, dzięki. Sorry że jestem uparty, ale gdyby chcieć to robić w mojej konwencji...

1 użytkowników online, w tym zalogowanych: 0, gości: 1