图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。
输入格式:
输入在第一行给出3个整数V(0
输出格式:
对每种颜色分配方案,如果是图着色问题的一个解则输出Yes
,否则输出No
,每句占一行。
输入样例:
6 8 3
2 1
1 3
4 6
2 5
2 4
5 4
5 6
3 6
4
1 2 3 3 1 2
4 5 6 6 4 5
1 2 3 4 5 6
2 3 4 2 3 4
输出样例:
Yes
Yes
No
No
#include
#include
#include
#include
#include
using namespace std;
#define M 500
//6 8 3
//2 1
//1 3
//4 6
//2 5
//2 4
//5 4
//5 6
//3 6
//4
//1 2 3 3 1 2
//4 5 6 6 4 5
//1 2 3 4 5 6
//2 3 4 2 3 4
set s[M + 5];
int ind[M + 5];
string check(vector v) {
for (int i = 1; i < v.size(); i++) {
int flag = 1;
for (auto x : s[i]) {
if (v[i] != v[x]) continue;
flag = 0;
break;
}
if (flag) continue;
return "No";
}
return "Yes";
}
int main() {
int n, m, k, t;
cin >> n >> m >> k;
for (int i = 0, a, b; i < m; i++) {
cin >> a >> b;
s[a].insert(b);
s[b].insert(a);
}
cin >> t;
for (int i = 0; i < t; i++) {
vector v(n + 1);
set t;
for (int j = 1, a; j <= n; j++) {
cin >> a;
v[j] = a;
t.insert(a);
}
if (t.size() != k) {
cout << "No" << endl;
continue;
}
cout << check(v) << endl;
}
return 0;
}