1

题目大意:

给出一个图(先给出所有边,后给出每个点的颜色),问是否满足:所有的边的两个点的颜色不相同,如果存在需要输出不同顶点个数,否则输出No。

算法思路:

我们使用set diff_colors保存每一次输入的每一个顶点,其大小就是不同顶点的个数,然后遍历每一条边,如果出现一条边的2个顶点颜色相同的情况,说明不存在k-coloring,输出No,否则输出diff_colors集合的大小。

提交结果:

image.png

AC代码:

#include<cstdio>
#include<unordered_set>

using namespace std;

struct Edge{
    int a,b;
}edges[10005];

int N,M;// 顶点和边的数目
unordered_set<int> diff_colors;
int colors[10005];// 记录每一个节点的颜色

int main(){
    scanf("%d %d",&N,&M);
    int a,b;
    for (int i = 0; i < M; ++i) {
        scanf("%d %d",&a,&b);
        edges[i].a = a;
        edges[i].b = b;
    }
    int K;
    scanf("%d",&K);
    for (int j = 0; j < K; ++j) {
        int color;
        bool proper = true;
        diff_colors.clear();// 每一次都得清空
        for (int i = 0; i < N; ++i) {
            scanf("%d",&color);
            colors[i] = color;
            diff_colors.insert(color);
        }
        // 遍历每一条边
        for (int k = 0; k < M; ++k) {
            int u = edges[k].a;
            int v = edges[k].b;
            if(colors[u]==colors[v]){
                // 一条边的2个顶点出现颜色相同的情况
                proper = false;
                break;
            }
        }
        if(proper){
            printf("%lu-coloring\n",diff_colors.size());
        } else {
            printf("No\n");
        }
    }
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得