随机图的生成算法:
其中 p=2E/(V*(V-1))
static void randG(Graph &G, int E)
{
double p=2.0*E/G.V()/(G.V()-1);
for(int i=0;i<G.V();++i)
for(int j=0;j<i;++j)
if(rand()<p*RAND_MAX)
G.insert(Edge(i,j));
}
不明白if(rand()<p*RAND_MAX)
是在做什么筛选,请教前辈们。
随机图的生成算法:
其中 p=2E/(V*(V-1))
static void randG(Graph &G, int E)
{
double p=2.0*E/G.V()/(G.V()-1);
for(int i=0;i<G.V();++i)
for(int j=0;j<i;++j)
if(rand()<p*RAND_MAX)
G.insert(Edge(i,j));
}
不明白if(rand()<p*RAND_MAX)
是在做什么筛选,请教前辈们。
完全图中边数与点数关系是:E = V (V-1) / 2,也就是每个点与剩下V-1个点都有边连接,p作为概率,满足了线性(要求的边数越大,则概率越大,则两点之间越可能有边相连,图越接近完全图)。假设rand()返回在[0, RAND_MAX]间,则E为0时p=0,E为V(V-1)/2时p=1。根据随机生成的rand决定当前(i,j)是否直连。不过这个是有向图?
1 回答2.9k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
1 回答1.9k 阅读✓ 已解决
2 回答2.4k 阅读
1 回答1.2k 阅读✓ 已解决
1 回答1.8k 阅读
抛砖引玉
rand()
生成0
与RAND_MAX
之间的整数,那么p*RAMD_MAX
相当于就是一个阈值,当“掷骰子”低于阈值时,当前迭代到的两个点之间连起来。