题目大意:就是先去构建一个图,然后给你一系列顶点。现在判断的是:一条边的两个顶点的颜色是不是不同。如果不同,那么表示的是k着色,且输出元素种类的个数。如果不存在相同输出No。
这里推荐使用邻接表,或者结构体直接去存储。因为10000条边,还要复杂度可能在1亿了,而时间给了0.9秒,可能会超时。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
const int N=10010;
bool st[N];
struct edge{
int a,b;
}e[N];
int color[N];
int main(){
cin>>n>>m;
for(int i=0;i<m;i++) cin>>e[i].a>>e[i].b;
cin>>k;
while(k--){
bool flag=true;
for(int i=0;i<n;i++) cin>>color[i];
for(int i=0;i<m;i++){
if(color[e[i].a]==color[e[i].b]){
flag=false;
break;
}
}
//表示的是顶点着色了
if(flag){
//统计不同数字出现的次数
set<int> s;
for(int i=0;i<n;i++) s.insert(color[i]);
printf("%d-coloring\n",s.size());
}
else puts("No");
}
return 0;
}