【题解】【AcWing】1648. 顶点着色

128 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1648. 顶点着色

原题传送:AcWing 1648. 顶点着色

一个合适的顶点着色是指用各种颜色标记图中各个顶点,使得每条边的两个端点的颜色都不相同。

如果一种合适的顶点着色方案使用了一共 kk 种不同的颜色,则称其为合适的 kk 着色(k-coloring)。

现在,你需要判断给定的着色方案是否是合适的 kk 着色方案。

输入格式

第一行包含两个整数 NNMM ,分别表示点和边的数量。

接下来 MM 行,每行包含两个整数 a,ba,b ,表示点 aa 和点 bb 之间存在一条边。

所有点的编号从 00N1N-1

再一行包含一个整数 KK ,表示你需要判断的着色方案。

接下来 KK 行,每行包含 NN 个颜色,其中第 ii 个颜色表示第 ii 个点的颜色。

颜色用非负整数表示,不超过int范围。

输出格式

对于每种着色方案,如果是一种合适的 kk 着色方案,则输出一行 k-coloring

如果不是合适的着色方案,则输出一行 No

数据范围

1N,M1041 \le N,M \le 10^4 , 1K1001 \le K \le 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;
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;
}