1154 Vertex Coloring (25分)
作者:CHEN, Yue
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
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
题意:
给出点与点之间的连接情况,然后在每个点里涂颜色,将第i种颜色涂进第i个点里,判断是否所有相连的点都不存在颜色相同的情况,若不存在则输出总共涂了多少种不同的颜色。
思路:
用邻接链表储存点与点之间的相连情况,将每个点的颜色用数组储存,并用set计算不同颜色的个数,遍历每个点的邻接链表,当出现颜色相同的情况则失败,遍历完都没失败则成功。
参考代码:
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
int n, m, a, b, k;
scanf("%d%d", &n, &m);
vector<int> G[n];
for (int i = 0; i < m; ++i) {
scanf("%d%d", &a, &b);
G[a].push_back(b);
G[b].push_back(a);
}
scanf("%d", &k);
for (int i = 0; i < k; ++i) {
int flag = 0;
vector<int> v(n);
set<int> s;
for (int j = 0; j < n; ++j) {
scanf("%d", &v[j]);
s.insert(v[j]);
}
for (int j = 0; j < n; ++j) {
if (flag) break;
for (int t = 0; t < G[j].size(); ++t) {
if (v[G[j][t]] == v[j])flag = 1;
}
}
if (flag)printf("No\n");
else printf("%d-coloring\n", s.size());
}
return 0;
}
如有错误,欢迎指正