[天梯赛] L2-023 图着色问题 思路以及一些坑
这题本身是个水题,但因为自己粗心没看清题意导致调了半天,所以开个随笔记录一下。题目链接
思路
1.建图
用邻接表或者邻接矩阵都可,我这里用的是邻接表,需要定义一个结构体保存点颜色,相比邻接矩阵要麻烦一点,但是在数据量 > 1000 时,还是建议用邻接表。
2.统计是否有颜色重复的点
抓住“任意两相邻相邻顶点不能有重复颜色”这一点,很容易想出其实就是遍历图的所有顶点 V,然后遍历顶点 V 的所有出边点,判断这些点颜色是否和 V 相同,然后根据题目要求输出相应结果即可。
坑点
这里有个天坑:必须使用 K 种颜色进行填色,题目中有,但是如果不仔细看很容易漏掉(如过漏掉这点最多只能得 1 分),对于之前没有接触过这种问题的我来说,更是难上加难。
然后把输出打成全大小导致全 wa 又调了半天,还以为是代码有问题...
代码
#include <iostream>
#include <vector>
using namespace std;
const int N = 510;
struct _G{
int color;
vector<int> e;
}G[N];
int n, e, k, m;
int main(){
cin >> n >> e >> k;
for(int i=0; i<e; i++){
int a, b;
cin >> a >> b;
G[a].e.push_back(b);
G[b].e.push_back(a);
}
cin >> m;
for(int i=0; i<m; i++){
int color, cnt = 0, appeared[N] = {0};
for(int j=1; j<=n; j++){
cin >> color;
G[j].color = color;
appeared[color] = 1;
}
for(int j=0; j<N; j++){
cnt += appeared[j];
}
if(cnt != k){
cout << "No" << endl;
continue;
}
int flag = 1;
for(int p=1; p<=n; p++){
int judge = 1;
for(int q=0; q<G[p].e.size(); q++){
if(G[p].color == G[G[p].e[q]].color){
judge = 0;
break;
}
}
if(!judge){
flag = 0;
cout << "No" << endl;
break;
}
}
if(flag){
cout << "Yes" << endl;
}
}
return 0;
}

浙公网安备 33010602011771号