题目大意:
给出一个图(先给出所有边,后给出每个点的颜色),问是否满足:所有的边的两个点的颜色不相同,如果存在需要输出不同顶点个数,否则输出No。
算法思路:
我们使用set diff_colors
保存每一次输入的每一个顶点,其大小就是不同顶点的个数,然后遍历每一条边,如果出现一条边的2个顶点颜色相同的情况,说明不存在k-coloring
,输出No,否则输出diff_colors
集合的大小。
提交结果:
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。