function [G] = BAmodel(rajz, fokszam, n, n0, L, L0)
%[G] = BAmodel(1, 0, 50, 0.03, 1, 3)
%[G] = BAmodel(0, 1, 1500, 0.03, 1, 3) %a fokszám eloszlás hatványfüggvény
%   BAmodel metódus gráfgenerálásra használható, Barabási - Albert eljárása
%   szerint
%
%   Bemenete:
%   n       - csúcsok száma
%   n0      - az él létezésének valószínûsége
%   L       - a csúcsok fokszáma
%   L0      - az élek száma a gráf létrehozásakor
%   rajz    - 1: kirajzolás lesz; 0: nem
%   fokszam - 1: fokszámok eloszlását számol és rajzol; 0: nem
%
%   Kimenete egy G adatstruktúra a következõ elemekkel:
%   G.Adj   - a gráf szomszédsági mátrixa (1 - a két csúcs között van él, 0
%   - a két csúcs között nincs él
%   G.nv    - csúcsok száma (vertices)
%   G.ne    - élek száma (edges)

A = zeros(n,n);
n0=n0*100;
steps=n-n0; 


% Elején véletlenszerûen feltöltjük a gráfot L0 éllel
for j=1:L0
    l_ = 1;
    n_ = 1;
    while (A(l_,n_)~=0) || (l_==n_)
        l_ = ceil(rand*n0);
        n_ = ceil(rand*n0);
    end
    A (l_,n_) = 1;
    A (n_,l_) = 1;
end;

% Mindegyik idõpillanatban hozzáadunk egy csúcsot m <= L+1, ekkor ez a
% csúcs újabb m csúccsal lesz kapcsolatban. Hogy segítsük a preferencia
% szerinti kapcsolódást, így az új csúcsot p(ki) = ki / sum(kj)
% valószínûséggel köti a már meglévõ csúcshoz.

for t = 1:steps
    
     k = zeros(n0+(t-1) ,1);
    for i = 1:n0+(t-1)
        k(i) = sum(A(i,:));
    end;
    P   = k./sum(k);
    PP  = cumsum(P);
    j=0; 
    k = 0;
    while (j<L && k<L^3)   % k<L^10 csak a végtelen ciklus elkerülése miatt van
        rv = rand(1);
        index_list = find(PP >= rv, 1);
        index = index_list(1);
        % ha még nincs él, hozzáadjuk
        if (A(n0+t,index)~=1)
            A(n0+t,index)=1;
            A(index,n0+t)=1;
            j=j+1;
        else
            k=k+1; %% error raise
        end
        
        
    end
    
    if (k>=L^3)
        display('error');
        G = [];
        return;
    end
    
    
end

G = struct('Adj', A, 'nv', n, 'ne', nnz(A)/2);

if rajz==1
    plotGraphBasic(G,3,1);
end

if fokszam==1
    plotKPk(G);
end










