给出一个图(先给出全部边,后给出每一个点的颜色),问是否知足:全部的边的两个点的颜色不相同,若是存在须要输出不一样顶点个数,不然输出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; }