1154頂点彩色(25ポイント)

アイデア:

幅優先探索BFSを使用して、一致するノードの色が近くのノードの色と異なるかどうか、およびグラフが切断されている状況を考慮する必要があります。色の数はセットで記録できます。

1154頂点彩色(25ポイント)

適切な頂点彩色が 同じエッジを共有しない2つの頂点が同じ色を有していないような色を持つグラフの頂点のラベルです。最大k色を使用するカラーリングは、(適切な)kカラーリングと呼ばれ ます。

ここで、特定のカラーリングが適切なkカラーリングであるかどうかを確認する必要があります。

例:

#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;

struct Graph {
    int Nv;
    int Ne;
    vector<set<int>> G;
};

int coloring(Graph &G, vector<int> &color)
{
    set<int> mark;
    queue<int> Q;
    vector<bool> visited(G.Nv, false);
    for(int i = 0; i < G.Nv; i++) {
        if(!visited[i]) {
            Q.push(i);
            mark.insert(color[i]);
            visited[i] = true;
            while(!Q.empty()) {
                int front = Q.front();
                for(auto &x : G.G[front]) {
                    if(color[x] == color[front]) return 0;
                    if(!visited[x]) {
                        Q.push(x);
                        visited[x] = true;
                        mark.insert(color[x]);
                    }
                }
                Q.pop();
            }
        }
    }
    return mark.size();
}

int main()
{
    int N, M, K;
    cin >> N >> M;
    Graph G;
    G.Nv = N, G.Ne = M, G.G.resize(N);
    for(int i = 0; i < M; i++) {
        int v1, v2;
        cin >> v1 >> v2;
        G.G[v1].insert(v2);
        G.G[v2].insert(v1);
    }
    cin >> K;
    vector<int> color(N);
    for(int i = 0; i < K; i++) {
        for(int j = 0; j < N; j++) cin >> color[j];
        int result = coloring(G, color);
        if(result > 0) printf("%d-coloring\n", result);
        else cout << "No\n";
    }
}

 

おすすめ

転載: blog.csdn.net/u012571715/article/details/114641349