我需要创建具有偶数顶点度数的随机连通无向图。我必须这样做来测试寻找不同顶点数(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);
}
}
它使连接的无向图形,但顶点度数不均匀。如何改善它以获得偶数顶点度?
答案 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;
}