【问题标题】:random undirected conected graph with even vertex degree具有偶数顶点度的随机无向连通图
【发布时间】:2014-05-29 15:38:52
【问题描述】:

我需要创建具有偶数顶点度的随机连接无向图。我必须这样做来测试为不同的顶点数 (N) 找到欧拉循环的时间。图的表示是邻接表。我有这样的代码:

void make_graph()
{
    int i,a,b,c;
    int nasycenie;

    nasycenie=(0.5)*((N*(N-1))/2);

    if(nasycenie<N-1) nasycenie=N-1;
   for(i=1;i<=nasycenie;++i)
   {
        if(i<N)
        {
        a=rand()%i;
        b=i;
        }
        else
        {
        a=rand()%N;
        b=rand()%(N-1);
        b+=(b>=a);
        }
    L1[a].push_back(b);
    L1[b].push_back(a);
   }
}

它使连接的无向图,但顶点度不均匀。如何改进它以获得均匀的顶点度数?

【问题讨论】:

  • 您可能需要检查模操作数。

标签: c++ graph


【解决方案1】:

此代码将创建您指定的图形,但在 AdjacencyMatrix(只有一半矩阵实际,因为图形是非直接的)表示中,将其转换为 AdjacencyList 并不难。

bool[vNum][vNum] make_graph(int vNum)
{
    bool[vNum][vNum] adjacency;
    int edgeNum = rand()%C(vNum , 2);
    for(int i=0 ; i<vNum; i++)
    {
        int j=0;
        for(j ; j<i; j++)
        {
            adjacency[i][j] = rand()%2; 
        }

        if(hasOddTrue(adjacency[i] , j))
        {
            int selectedIndex = rand()%j;
            adjacency[i][selectedIndex ] = !adjacency[i][selectedIndex ];
        }
    } 
    return adjacency;
}

bool hasOddTrue(bool[] list , int length)
{
    bool b = false;
    for(int i=0 ; i<length ; i++) { b = xor(b,  list[i]); }
    return b;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多