用c ++生成随机连通图

时间:2017-05-09 04:23:25

标签: c++ algorithm

所以我必须为无向图制作生成函数。它必须制作一个随机连接的图形。首先,我必须创建一个生成树,然后继续使用更多边。

所以,让我们说我必须制作一张100-vertice图表,其密度(我想这就是你用英语说的),让我们说25%。所以我必须制作1237.5边(让我们说1237)。

现在我会这样做:

  1. 列出所有未使用的顶点
  2. 随机选择其中两个,连接它们,从列表中删除第一个
  3. 将下一个顶点连接到之前连接的顶点(第二个顶点,不从列表中删除)
  4. 在我们使用所有顶点(空列表)之前执行此操作
  5. 然后计算我要添加的数量(1237-100)
  6. 现在随机选择2个顶点,检查它们是否已连接。如果没有,请连接它们。重复这1137次
  7. 现在我有一个连接图。问题是我为此编写了C ++代码。它按预期工作,但我必须测量一些操作的时间(不是生成,f.e Prim算法),密度= {25, 50, 75, 99}和5个不同的顶点量(f.e从500到5000)。我已经开办了一个可以这样做的计划。它现在跑了半个小时。有没有办法让我可以优化我的代码(通过改变我的步骤)以使其更快? (我特别希望步骤6更方便,因为选择2个随机值并检查它们是否未连接(这意味着,迭代整个矢量矢量)并不是很好,因为我可以再次随机选择相同的值,它可以去4ever)

    代码:

    std::vector<std::vector<int>> undirected_graph::generate(int vertices, int d)
    {
        float density = d / 100;
        std::vector<std::vector<int>> data;
        density = density / 100;
        int edges = floor(density * vertices * (vertices - 1) / 2);
        std::vector<int> v_vertices(vertices);
        std::iota(std::begin(v_vertices), std::end(v_vertices), 0);
        std::random_device r;
        std::default_random_engine e1(r()); 
        std::uniform_int_distribution<int> uniform_dist2(1, 100);
        int random = 0, random1;
        v_vertices.erase(v_vertices.begin());
        for (int i = 0; i < vertices - 1; i++) // spanning tree
        {   
            std::uniform_int_distribution<int> uniform_dist1(0, v_vertices.size() - 1);
            random1 = uniform_dist1(e1);
            data.push_back({ random , v_vertices[random1], uniform_dist2(e1) }); // random edge
            random = v_vertices[random1];
            v_vertices.erase(v_vertices.begin() + random1);     
        }
        // now the additional edges
        int needed = edges - vertices;
        std::uniform_int_distribution<int> uniform_dist1(0, vertices-1);
        std::uniform_int_distribution<int> uniform_dist3(0, vertices-1);
        for (int i = 0; i < needed;)
        {
            random = uniform_dist1(e1);
            random1 = uniform_dist3(e1);
            if (random != random1)
            {
                if (!multipleEdgeGenerate(data, random, random1)) // checking if edge like this exists
                {
                    data.push_back({ random , v_vertices[random1], uniform_dist2(e1) });
                    i++;
                }
            }
        }
        return data;
    }
    

0 个答案:

没有答案