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 N and 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
有一个bug调了一会儿,只有一个环的时候起点终点需要特判颜色是否相同,索性就全部判断了一遍。
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <sstream>
using namespace std;
const int maxn = 10050;
const int INF = 0x3f3f3f3f;
int n, m, k;
int u, v;
bool fg = false;
int color[maxn];
int sum; //颜色总数
bool S[maxn];
vector<int>mp[maxn]; //记录联通情况
map<int, bool>mm; //记录着色情况
void Init() {
sum = 0;
fg = false;
mm.clear();
fill(S, S + maxn, false);
}
void dfs(int st) {
S[st] = true;
for (int i = 0; i < mp[st].size(); i++) {
if (fg) return;
int v = mp[st][i];
if (S[v]) {
if (color[st] == color[v]) { fg = true; cout << "No" << endl; return; }
else continue;
}
if (color[st] == color[v]) { fg = true; cout << "No" << endl; return; }
map<int, bool>::iterator it = mm.find(color[v]);
if (it == mm.end()) {
mm[color[v]] = true;
sum++;
}
dfs(v);
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> u >> v;
mp[u].push_back(v);
mp[v].push_back(u);
}
cin >> k;
for (int i = 0; i < k; i++) {
Init();
for (int j = 0; j < n; j++) cin >> color[j];
for (int j = 0; j < n; j++) {
if (fg) break;
if (!S[j]){
map<int, bool>::iterator it = mm.find(color[j]);
if (it == mm.end()) {
mm[color[j]] = true;
sum++;
}
dfs(j);
}
}
if (!fg) cout << sum << "-coloring" << endl;
}
}