給出一個圖(先給出全部邊,後給出每一個點的顏色),問是否知足:全部的邊的兩個點的顏色不相同,若是存在須要輸出不一樣頂點個數,不然輸出No。算法
咱們使用set diff_colors
保存每一次輸入的每個頂點,其大小就是不一樣頂點的個數,而後遍歷每一條邊,若是出現一條邊的2個頂點顏色相同的狀況,說明不存在k-coloring
,輸出No,不然輸出diff_colors
集合的大小。spa
#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; }