如何从图形的邻接列表表示中随机选择边缘

How to pick edge randomly from adjacency list representation of graph

本文关键字:表示 随机 选择 边缘 列表 图形      更新时间:2023-10-16
vector<int> adj[5]; // I have 5 nodes 
// some code for pushing nodes in adjacency list
for( int i = 0; i < 5; i++ )  // printing graph  
{
    for( int p = 0 ; p < adj[i].size(); p++ )
    {
        cout<< i << " , "<< adj[i][p] << endl;
    }
}
srand (time(NULL));
for( int k = 0 ; k < 3; k++ )  // just want to see random output multiple times, so using for loop 3 times.
{
    int i = rand() % 5; // picking node ( 1-5) randomly 
    int p = adj[i].size(); // calculating number of adjacent nodes 
    int j = rand() % p;   // here I am wrong, 
    cout<< " Random edge " << i+1 <<", " << j;
}

实际上,我想实施Kargar的Min cut计划。为此,我想随机选择一个边缘。但我面临这个问题:

我收到浮点异常。 core dumped如果我将上面的代码添加到我的程序中。我检查了带有 int iint p 的行是否计算完美(我打印了它们以查看(,但是如果您在代码中添加int j = rand() % p,它会给出浮点异常(核心转储(。

谁能帮我?

如果你想均匀地随机选择一个边,你的算法是不正确的。例如:

0: 1,2,3
1: 2
2: 3,4,5
3: 4,5
4: 5

在这种情况下,选择边 (1,2( 的概率大于边 (0,1(。

至于异常问题,我想一些 adj[i].size(( 等于 0。

此外,虽然 rand(( 不返回负数,但请注意负数的模数可以是负数,例如 -3%5=-3。