[天梯赛] 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;
}
posted @ 2020-11-14 16:45  CTRN43062  阅读(399)  评论(0)    收藏  举报