void TForestFire::InfectRnd(const int& NInfect) { IAssert(NInfect < Graph->GetNodes()); TIntV NIdV(Graph->GetNodes(), 0); for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { NIdV.Add(NI.GetId()); } NIdV.Shuffle(Rnd); InfectNIdV.Gen(NInfect, 0); for (int i = 0; i < NInfect; i++) { InfectNIdV.Add(NIdV[i]); } }
/// Barabasi-Albert model of scale-free graphs. /// The graph has power-law degree distribution. /// See: Emergence of scaling in random networks by Barabasi and Albert. /// URL: http://arxiv.org/abs/cond-mat/9910332 PUNGraph GenPrefAttach(const int& Nodes, const int& NodeOutDeg, TRnd& Rnd) { PUNGraph GraphPt = PUNGraph::New(); TUNGraph& Graph = *GraphPt; Graph.Reserve(Nodes, NodeOutDeg*Nodes); TIntV NIdV(NodeOutDeg*Nodes, 0); // first edge Graph.AddNode(0); Graph.AddNode(1); NIdV.Add(0); NIdV.Add(1); Graph.AddEdge(0, 1); TIntSet NodeSet; for (int node = 2; node < Nodes; node++) { NodeSet.Clr(false); while (NodeSet.Len() < NodeOutDeg && NodeSet.Len() < node) { NodeSet.AddKey(NIdV[TInt::Rnd.GetUniDevInt(NIdV.Len())]); } const int N = Graph.AddNode(); for (int i = 0; i < NodeSet.Len(); i++) { Graph.AddEdge(N, NodeSet[i]); NIdV.Add(N); NIdV.Add(NodeSet[i]); } } return GraphPt; }