遍历所有边,不需要用深搜,只需要把读入的每条边再循环一遍就ok了

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
int arr[maxn];
struct node{
	int u,v;
}E[maxn];

set<int> st;

int main(){
	int n,m,u,v;
	scanf("%d%d",&n,&m);
	
	for(int i=0; i<m; i++){
		scanf("%d%d",&u,&v);
		E[i].u = u;
		E[i].v = v;
	}
	int k;
	scanf("%d",&k);
	while(k--){
		memset(arr,-1,sizeof(arr));
		st.clear();
		for(int i=0;i<n;i++){
			scanf("%d",&arr[i]);
			st.insert(arr[i]); 
		}
		int flag=0;
		for(int i=0;i<m;i++){
			if(arr[E[i].u] == arr[E[i].v]){
				flag=1;
				break;
			}
		}
		if(flag){
			printf("No\n");
		}else 
			printf("%d-coloring\n",st.size());
	}
	
	
	return 0;
}