PAT クラス A 1154 頂点シェーディング

元のタイトルへのリンク

適切な頂点の色付けとは、各エッジの 2 つの端点が異なる色になるように、グラフ内の各頂点をさまざまな色でマークすることを指します。

適切な頂点カラーリング スキームが合計 k 個の異なる色を使用する場合、それは適切な k-カラーリング (k-coloring) と呼ばれます。

ここで、与えられたカラーリングスキームが適切な k-カラーリングスキームであるかどうかを判断する必要があります。

入力形式
最初の行には、頂点とエッジの数をそれぞれ表す 2 つの整数 N と M が含まれています。

次の M 行には、各行に 2 つの整数 a、b が含まれます。これは、点 a と点 b の間にエッジがあることを意味します。

すべての点には 0 から N-1 までの番号が付けられます。

次の行には、判断する必要がある配色スキームを示す整数 K が含まれています。

次の K 行には、各行に N 色が含まれており、i 番目の色は i 番目の点の色を表します。

色は int の範囲を超えない非負の整数で表されます。

出力形式
各カラーリングスキームについて、それが適切な k-カラーリングスキームであれば、k-カラーリングの行を出力します。

適切な配色でない場合は、No.の行を出力します。

データ範囲
1≦N、M≦104、1≦K
≦100
入力例:
10 11
8 7 6
8
4 5 8 4 8
1 1 2 1 4 9 8 9 1 1 0 2 4 4 0 1 0 1 4 1 0 1 3 0 0 1 0 1 4 1 0 1 0 0 8 1 0 1 4 1 0 5 3 0 1 2 3 4 5 6 7 8 8 9サンプル出力: 4 色塗りなし6色塗りなし
















私の解決策:

#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n, m, k;
struct {
    int a, b;
}Edge[N];
int color[N];
int main(){
    cin >> n >> m;
    for(int i = 0; i < m; i ++ ){
        cin >> Edge[i].a >> Edge[i].b;
    }
    cin >> k;
    while(k --){
        bool success = true;
        for(int i = 0; i < n; i ++ ) cin >> color[i];
        for(int i = 0; i < m; i ++ ){
            if(color[Edge[i].a] == color[Edge[i].b]) success = false;
        }
        if(success){
            unordered_set <int> S;
            for(int i = 0; i < n; i ++ ) S.insert(color[i]);
            printf("%d-coloring\n", S.size());
        }
        else puts("No");
    }
    return 0;
}

褒美:

配列内で、unowned_set<int> を使用して、出現する数値の数をカウントします。

挿入メソッド S.insert()

(auto c : S) のトラバーサル メソッド

セットとの違い:

set は自動的にソートされますが、unowned_set は自動的にソートされません

おすすめ

転載: blog.csdn.net/weixin_45660485/article/details/126046440