一个合适的顶点着色是指用各种颜色标记图中各个顶点,使得每条边的两个端点的颜色都不相同。
即对于所有i, 0 <= i < m,color[edge[i].x] != color[edge[i].y]
都成立,则该着色是一种合适的 k 着色方案。
即只要有一个i,color[edge[i].x] == color[edge[i].y]
成立,则该着色不是一种合适的k着色方案
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int N = 1e4 + 10,M = 1e4 + 10;
struct Edge {
int x,y;
}edge[M];// 存储边
int color[N];// 存储端点颜色
int n,m;
bool check(){
for(int i = 0;i < m;i ++){
if(color[edge[i].x] == color[edge[i].y]){
return false;
}
}
return true;
}
int main()
{
cin >> n >> m;
for(int i = 0;i < m;i ++){
int a,b;
cin >> a >> b;
edge[i] = {a,b};
}
int q;
cin >> q;
while(q --){
unordered_set<int> se;
for(int i = 0;i < n;i ++){
cin >> color[i];
se.insert(color[i]);
}
if(check()){
printf("%d-coloring\n",se.size());
}
else{
printf("No\n");
}
}
return 0;
}