だから、私はグラフを楽しみたいと思っていましたが、今では夢中になっています。
まず、指定された数のエッジを持つ連結グラフを生成します。これは私の呪いになった簡単な部分です。基本的には意図したとおりに動作しますが、得られた結果はかなり奇妙です (まあ、そうではないかもしれませんが、ここでの問題です)。グラフを生成するアルゴリズムは非常に単純です。
0
2 つの配列があり、そのうちの 1 つは からまでの数値で満たされ、もう 1 つn - 1
は空です。
最初に、最初の要素をシャッフルして、最後の要素を空の要素に移動します。
次に、ループで、最初の配列の最後の要素と2番目の配列のランダムな要素の間にエッジを作成し、その後、最後の要素を最初の配列から別の配列に移動します。
その部分が完了したら、必要な数が得られるまで、頂点間にランダムなエッジを作成する必要があります。これも非常に簡単です。0
からまでの範囲の 2 つの数値をランダムに選択しn - 1
、これらの頂点間にエッジがない場合は、1 つ作成します。
これはコードです:
void generate(int n, double d) {
initMatrix(n); // <- creates an adjacency matrix n x n, filled with 0s
int *array1 = malloc(n * sizeof(int));
int *array2 = malloc(n * sizeof(int));
int j = n - 1, k = 0;
for (int i = 0; i < n; ++i) {
array1[i] = i;
array2[i] = 0;
}
shuffle(array1, 0, n); // <- Fisher-Yates shuffle
array2[k++] = array1[j--];
int edges = d * n * (n - 1) * .5;
if (edges % 2) {
++edges;
}
while (j >= 0) {
int r = rand() % k;
createEdge(array1[j], array2[r]);
array2[k++] = array1[j--];
--edges;
}
free(array1);
free(array2);
while (edges) {
int a = rand() % n;
int b = rand() % n;
if (a == b || checkEdge(a, b)) {
continue;
}
createEdge(a, b);
--edges;
}
}
さて、これを印刷すると立派なグラフです。次に、ハミルトニアン サイクルを見つけたいと思います。この部分は機能します。次に、私の悩みの種であるオイラーサイクルに行き着きます。どうしたの?
まず、すべての頂点が偶数かどうかを確認します。そして、そうではありません。いつも。完全なグラフを生成することを選択しない限り、毎回。
私は今、自分のコードによって破壊されていると感じています。何か間違えている?それともこうあるべきなのか?オイラー回路がまれであることはわかっていましたが、それほどまれではありませんでした。助けてください。