0

The Algorithm Design Manualでは、著者はグラフを 2 色で着色するためのアルゴリズムを提供しています。これは、コンポーネントの数をカウントするアルゴリズムに似ています。使用可能なすべての頂点を反復処理し、検出されない場合にのみ、その頂点に色を付けて BFS を実行します。

for(i = 1; i <= (g->nvertices); i++) {
    if(discovered[i] == FALSE) {
        color[i] = WHITE;
        bfs(g, i);
    }
}

BFS は、エッジが処理されていない場合、またはグラフが有向であるprocess_edge場合に関数を呼び出します。BFS は次のようになります。yx -> y

bfs(graph *g, int start) {

    queue q; //queue of vertices to visit
    int v; //current vertex
    int y; //successor vertex
    edgenode* p; //temporary pointer used to traverse adjacency list

    init_queue(&q);
    enqueue(&q, start);
    discovered[start] = TRUE;

    while(empty_queue(&q) == FALSE) {
        v = dequeue(&q);

        process_vertex_early(v); //function that handles early processing
        processed[v] = TRUE;
        p = g->edges[v];

        while(p != NULL) {
            y = p->y;

            //If the node hasn't already been processed, or if the graph is directed
            //process the edge. This part bothers me with undirected graphs
            //because how would you process an edge that was wrongly colored
            //in an earlier iteration when it will have processed[v] set to TRUE?
            if((processed[y] == FALSE) || g->directed) {
                process_edge(v, y); //coloring happens here
            }

            if(discovered[y] == FALSE) {
                enqueue(&q, y);
                discovered[y] = TRUE;
                parent[y] = v;
            }

            p = p->next;
        }

        process_vertex_late(v); //function that handles late processing
    }
}

関数は次のprocess_edgeようになります。

process_edge(int x, int y) {
    if(color[x] == color[y]) {
        bipartite = FALSE;
        printf("Warning: not bipartite due to (%d, %d)\n", x, y);
    }

    color[y] = complement(color[x]);
}

ここで、次のようなグラフがあるとします。

ここに画像の説明を入力

次のように 2 色にできます。

ここに画像の説明を入力

ただし、頂点の順序でトラバースする場合は、最初に node から開始し、それを に1色付けしWHITEます。次に、ノードを見つけ13て に色付けしBLACKます。ループの次の反復では、ノードが検出されてい5ないため、色をWHITE付けて BFS を開始します。これを行っている間に、ノード5との間の競合が検出されます。次に、 と の間に別の矛盾があることを発見します。11BLACKWHITE11313WHITEBLACK

すべてのコンポーネント (接続されているかどうかに関係なく) を介してグラフの通常のトラバーサルを実行する場合、いずれにせよすべてのノードにアクセスすることになるため、順序は問題になりませんが、グラフに色を付ける場合は順序が問題になるようです。私は本でこれについての言及を見たことがなく、上記のようなランダムに生成されたグラフを 2 色にしようとしたときにのみ、この問題に出くわしました。既存のアルゴリズムに小さな変更を加えることができたので、この問題は解消されました。

for(i = 1; i <= (g->nvertices); i++) {
    //Only initiate a BFS on undiscovered vertices and vertices that don't
    //have parents.
    if(discovered[i] == FALSE && parent[i] == NULL) {
        color[i] = WHITE;
        bfs(g, i);
    }
}

この変更は理にかなっていますか、それとも基本的な概念を理解していないためのハックですか?

アップデート

G.バッハの回答に基づいて、次のグラフがあると仮定します。

ここに画像の説明を入力

どうすればこれが適切に 2 色になるのか、私はまだ混乱しています。元のアルゴリズムでは、最初の反復でノードを使用して BFS が開始され、次1のような色のグラフが得られます。

ここに画像の説明を入力

次の反復では、ノード5を使用して BFS を開始し、次のような色のグラフを表示します。

ここに画像の説明を入力

次の反復では、ノードを使用して BFS を開始し、次6のような色のグラフを表示します。

ここに画像の説明を入力

しかし、ここで5は既にアクセス済みであるため、色を変更しません。これにより、適切に色付けされていないグラフが残ります。

4

2 に答える 2

1

方向が実際に問題になり始める別の問題を定義しない限り、グラフの有向性は、提起した二部彩色問題には関係ありません。したがって、例で使用したグラフを無向グラフに変換し、教科書に示されているようにアルゴリズムを実行できます。

教科書では、グラフが無向であるべきだと明示的に述べていませんが、エッジの方向は、私たちが研究する一般的な色付けの問題とは関係ありません。ただし、エッジの方向を考慮した問題を定義できます ( http://www.labri.fr/perso/sopena/pmwiki/index.php?n=TheOrientedColoringPage.TheOrientedColoringPage )。

注: コメントとしてこれを書くつもりでしたが、初心者として、いくつかの評判ポイントを蓄積するまで、そうすることが許可されていません。

于 2013-12-01T02:07:14.390 に答える
0

BFS を使用した 2 部グラフの色付けは、頂点の順序に依存しません。二部グラフ A と B の分割を構成する 2 つの頂点セットを呼び出します。WLOGaは A の頂点から開始し、白に色付けします。最初の BFS は、N(a)すべて BLACK で表示されるネイバーを見つけます。v in N(a)all のすべての場合v in B、これは BFS を開始し (これを正しく読んだ場合)、どれが再びN(v)のサブセットであるかを見つけA、それらをすべて白く塗りつぶします。

これを使用して 2 部グラフではないグラフに色を付けようとすると、奇数の長さのサイクルに遭遇し (サブグラフのようなサイクルを持つことは 2 部グラフではないことに相当するため)、BFS はある時点で の開始頂点に遭遇します。その奇妙なサイクルをもう一度見てみると、すでに色があることがわかりますが、割り当てたい色はありません。

あなたのグラフで起こると私が想定しているのは (1 から始まる BFS に 5 が含まれていないため)、それは指示されているということです。あなたが読んだアルゴリズムは無向グラフ用に書かれたものだと思います。そうでなければ、あなたが説明した問題に遭遇するからです。また、カラーリング グラフは一般的に無向グラフで定義されます (もちろん、有向グラフにも適用できます)。

あなたの修正は一般的に問題を解決しません。6エッジとともに新しい頂点を追加する6->24と、同じ問題が発生します。から始まるBFS は黒く、から始まる BFS は白くします5。ただし、そのグラフは依然として 2-colorable です。16

于 2013-04-08T02:05:29.160 に答える