PAT_甲級_1154 Vertex Coloring

題目大意:

給出一個圖(先給出全部邊,後給出每一個點的顏色),問是否知足:全部的邊的兩個點的顏色不相同,若是存在須要輸出不一樣頂點個數,不然輸出No。算法

算法思路:

咱們使用set diff_colors保存每一次輸入的每個頂點,其大小就是不一樣頂點的個數,而後遍歷每一條邊,若是出現一條邊的2個頂點顏色相同的狀況,說明不存在k-coloring,輸出No,不然輸出diff_colors集合的大小。spa

提交結果:

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;
}
相關文章
相關標籤/搜索