题解:用dfs遍历图的每条边就好,这里注意要求颜色的个数为k
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #include <map> #include <vector> #include <set> using namespace std; const int maxn=510; int v,e,k; vector<int> edge[maxn]; int val[maxn]; int vis[maxn]; int flag; void dfs(int now,int fa) { if(flag==1) return ; int len=edge[now].size(); for(int i=0;i<len;i++) { int next=edge[now][i]; if(val[now] == val[next]) { flag=1; return; } if(next != fa && vis[next] == 0 ) { vis[next]=1; dfs(next,now); } } } int main() { scanf("%d %d %d",&v,&e,&k); for(int i=1;i<=e;i++) { int a,b; scanf("%d %d",&a,&b); edge[b].push_back(a); edge[a].push_back(b); } int q; cin>>q; while(q--) { set<int> st; memset(vis,0,sizeof(vis)); flag=0; for(int i=1;i<=v;i++) { scanf("%d",&val[i]); st.insert(val[i]); } if(st.size() != k) cout<<"No"<<endl; else { for(int i=1;i<=v;i++) { if(flag==1) break; if(!vis[i]) { vis[i]=1; dfs(i,i); } } if(flag==1) cout<<"No"<<endl; else cout<<"Yes"<<endl; } } return 0; }