如何从图的邻接列表表示中随机选取边

时间:2017-03-31 11:51:33

标签: c++ stl graph-algorithm

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则会给出浮点异常(核心转储)。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果您想要均匀随机选取边缘,则算法不正确。 例如:

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。