本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1648. 顶点着色
原题传送:AcWing 1648. 顶点着色
一个合适的顶点着色是指用各种颜色标记图中各个顶点,使得每条边的两个端点的颜色都不相同。
如果一种合适的顶点着色方案使用了一共 种不同的颜色,则称其为合适的 着色(k-coloring)。
现在,你需要判断给定的着色方案是否是合适的 着色方案。
输入格式
第一行包含两个整数 和 ,分别表示点和边的数量。
接下来 行,每行包含两个整数 ,表示点 和点 之间存在一条边。
所有点的编号从 到 。
再一行包含一个整数 ,表示你需要判断的着色方案。
接下来 行,每行包含 个颜色,其中第 个颜色表示第 个点的颜色。
颜色用非负整数表示,不超过int范围。
输出格式
对于每种着色方案,如果是一种合适的 着色方案,则输出一行 k-coloring。
如果不是合适的着色方案,则输出一行 No。
数据范围
,
输入样例:
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;
int vers[N];
struct Edge
{
int a, b;
}e[N];
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)
scanf("%d%d", &e[i].a, &e[i].b);
int k;
scanf("%d", &k);
for(int T = 1; T <= k; T++)
{
unordered_set<int> S;
for(int i = 0; i < n; i++)
{
scanf("%d", &vers[i]);
S.insert(vers[i]);
}
bool success = true;
for(int i = 0; i < m; i++)
{
int x = e[i].a, y = e[i].b;
if(vers[x] == vers[y])
{
success = false;
break;
}
}
if(success)
printf("%d-coloring\n", S.size());
else
printf("No\n");
}
return 0;
}