思路:
存边,枚举边判断两个端点颜色是否一样。
这里我在存颜色的时候出了问题,在读入颜色时直接存入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;
}