一、题目概述
若任一对邻接顶点都拥有不同颜色,称proper k-coloring,k为颜色总数。判定给定顶点配色是否符合proper k-coloring定义,并确定k。
二、思路
建立边结构体及数组,顺序存储边结点。存在边,其两端顶点着色相同,输出"No"。
三、代码
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
int main()
{
int N, M, K;
scanf("%d %d", &N, &M);
vector<int> color(N);
vector<vector<int>> edge(M, vector<int>(2));
for( int i = 0; i < M; ++i )
scanf("%d %d", &edge[i][0], &edge[i][1]);
scanf("%d", &K);
for( int i = 0, k , flag; i < K; ++i )
{
k = 0;
flag = 1;
map<int, bool> repeated;
for( int j = 0; j < N; ++j )
{
scanf("%d", &color[j]);
if( !repeated[color[j]] )
{
++k;
repeated[color[j]] = true;
}
}
for( int j = 0; j < M && flag; ++j )
if( color[edge[j][0]] == color[edge[j][1]] )
flag = 0;
if( flag )
printf("%d-coloring\n", k);
else printf("No\n");
}
}