具有偶数顶点度的随机无向连通图

时间:2014-05-29 15:38:52

标签: c++ graph

我需要创建具有偶数顶点度数的随机连通无向图。我必须这样做来测试寻找不同顶点数(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);
   }
}

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

1 个答案:

答案 0 :(得分:0)

此代码将创建您指定的图形,但在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;
}