適切な頂点の色付けとは、各エッジの 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 は自動的にソートされません