L2-023 图着色问题

 

图着色问题是一个著名的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;
}

你可能感兴趣的:(算法题,算法,c++,数据结构)