一个合适的顶点着色是指用各种颜色标记图中各个顶点,使得每条边的两个端点的颜色都不相同。
如果一种合适的顶点着色方案使用了一共 k 种不同的颜色,则称其为合适的 k 着色(k-coloring)。
现在,你需要判断给定的着色方案是否是合适的 k 着色方案。
输入格式
第一行包含两个整数 N 和 M,分别表示点和边的数量。接下来 M 行,每行包含两个整数 a,b,表示点 a 和点 b 之间存在一条边。
所有点的编号从 0 到 N−1。
再一行包含一个整数 K,表示你需要判断的着色方案。
接下来 K 行,每行包含 N 个颜色,其中第 i 个颜色表示第 i 个点的颜色。
颜色用非负整数表示,不超过 int 范围。
输出格式
对于每种着色方案,如果是一种合适的 k 着色方案,则输出一行 k-coloring。扫描二维码关注公众号,回复: 15958414 查看本文章如果不是合适的着色方案,则输出一行 No。
数据范围
1≤N,M≤104,
1≤K≤100
输入样例:
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
输出样例:
4-coloring
No
6-coloring
No
我的解法:
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n, m, k;
struct {
int a, b;
}Edge[N];
int color[N];
int main(){
cin >> n >> m;
for(int i = 0; i < m; i ++ ){
cin >> Edge[i].a >> Edge[i].b;
}
cin >> k;
while(k --){
bool success = true;
for(int i = 0; i < n; i ++ ) cin >> color[i];
for(int i = 0; i < m; i ++ ){
if(color[Edge[i].a] == color[Edge[i].b]) success = false;
}
if(success){
unordered_set <int> S;
for(int i = 0; i < n; i ++ ) S.insert(color[i]);
printf("%d-coloring\n", S.size());
}
else puts("No");
}
return 0;
}
收获:
在数组中,用unordered_set<int>统计共有几种数字出现
插入方式 S.insert()
遍历方式 for(auto c : S)
与set区别:
set自动排序,unordered_set不自动排序