function [G] = BAmodel(rajz, fokszam, n, n0, L, L0)
%Példa fv hívások: [G] = BAmodel(1, 0, 50, 3, 1, 3)
%[G] = BAmodel(0, 1, 1500, 3, 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      - kezdeti csúcszám 
%   L       - az új csúcshoz húzott élek szá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);
steps=n-n0; %ennyi csúcs kell még


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

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

for t = 1:steps %új csúcs hozzáadása
    
    k=sum(A(1:n0+t-1,:)); %már meglévõ csúcsok fokszámai
    P   = k /sum(k); %normálás
    PP  = cumsum(P); %valószínûségi eloszlás készítése
    j=0; %behúzott élek száma
    k = 0; %rossz helyre tervezett él
    while (j<L && k<L^3)   % k<L^3 csak a végtelen ciklus elkerülése miatt van
        rv = rand(1);
        index = find(PP >= rv, 1); %melyik csúcshoz tartozzon az él
        % 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,5,1);
end

if fokszam==1
    plotKPk(G);
end
