A proper vertex coloring is a labeling of the graph's vertices with colors such that no two vertices sharing the same edge have the same color. A coloring using at most k colors is called a (proper) k-coloring.
Now you are supposed to tell if a given coloring is a proper k-coloring.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers Nand M (both no more than 104), being the total numbers of vertices and edges, respectively. Then M lines follow, each describes an edge by giving the indices (from 0 to N−1) of the two ends of the edge.
After the graph, a positive integer K (≤ 100) is given, which is the number of colorings you are supposed to check. Then K lines follow, each contains N colors which are represented by non-negative integers in the range of int. The i-th color is the color of the i-th vertex.
Output Specification:
For each coloring, print in a line k-coloring
if it is a proper k
-coloring for some positive k
, or No
if not.
Sample Input:
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
Sample Output:
4-coloring
No
6-coloring
No
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int n, m;
vector<int> vec(n);
vector<bool> visit;
vector<int> vec_graph[10009];
//int graph[10001][10001] = {0};
set<int> set_k;
bool BFS(int start){
queue<int> q;
visit[start] = true;
q.push(start);
while (!q.empty())
{
start = q.front();
q.pop();
for(int z = 0; z < vec_graph[start].size(); z++){
if(vec[start] == vec[vec_graph[start][z]])
return false;
if(!visit[vec_graph[start][z]]){
visit[vec_graph[start][z]] = true;
q.push(vec_graph[start][z]);
}
}
}
return true;
}
int main(){
cin >> n >> m;
// memset(graph, 0, sizeof(graph));
for(int i = 0; i < m; i++){
int temp_x , temp_y;
scanf("%d %d", &temp_x, &temp_y);
// cin >> temp_x >> temp_y;
vec_graph[temp_x].push_back(temp_y);
// vec_graph[temp_y].push_back(temp_x);
// graph[temp_x][temp_y] = graph[temp_y][temp_x] = 1;
}
int k;
scanf("%d", &k);
for(int i = 0; i < k; i++){
// bool visit[10001] = {false};
visit.clear();
vec.clear();
set_k.clear();
bool flag = true;
for(int j = 0; j < n; j++){
int temp;
scanf("%d", &temp);
vec.push_back(temp);
set_k.insert(temp);
visit.push_back(false);
}
for(int start = 0; start < n; start++){
if(!visit[start])
if(!BFS(start)){
flag = false;
break;
}
}
if(flag){
cout << set_k.size() << "-coloring" << endl;
// printf("%lu-coloring\n", set_k.size());
}else
{
printf("No\n");
}
}
return 0;
}