思路:
存边,枚举边判断两个端点颜色是否一样。
这里我在存颜色的时候出了问题,在读入颜色时直接存入set,是没问题的。但是枚举边的时候存,存的颜色可能会变少,因为不一定是个连通图。(第3个样例)
ac代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int u,v,nxt;
}side[100000];
int cnt=0,head[20000],c[20000];
void add(int x,int y){
side[cnt].u=x;
side[cnt].v=y;
side[cnt].nxt=head[x];
head[x]==cnt++;
}
set<int> ss;
int main(){
memset(head,-1,sizeof(head));
cnt=0;
int n,m,u,v;
cin>>n>>m;
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
add(u,v);
//add(v,u);
}
int q;
scanf("%d",&q);
while(q--){
ss.clear();
for(int i=0;i<n;i++){
scanf("%d",&c[i]);
ss.insert(c[i]);
}
int f=1;
for(int i=0;i<cnt;i++){
if(c[side[i].u]==c[side[i].v]){
f=0;break;
}
//图可能不连通,放这取颜色,颜色数量取不全
}
if(f) {
printf("%d-coloring\n",ss.size());
}
else printf("No\n");
}
return 0;
}