做这道题有一点需要注意,我一开始以为题目给的图一定是连通图,没有在dfs外套for循环,结果有一个测试点过不去,最后尝试着加上后就对了。
#include<iostream>
#include<vector>
#include<set>
#include<cstring>
using namespace std;
vector<int> v[505];
int n;
bool vis[505];
int color[505];
bool dfs(int s) {
vis[s]=true;
for(int i=0; i<v[s].size(); i++) {
int u=v[s][i];
if(color[s]==color[u])
return false;
if(vis[u]==false) {
return dfs(u);
}
}
return true;
}
int main() {
int E,K;
cin>>n>>E>>K;
for(int i=0; i<E; i++) {
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
int k,t;
cin>>k;
for(int i=0; i<k; i++) {
memset(color,-1,sizeof(color));
memset(vis,0,sizeof(vis));
set<int> f;
for(int j=0; j<n; j++) {
scanf("%d",&color[j+1]);
f.insert(color[j+1]);
}
if(f.size()!=K) {
cout<<"No\n";
continue;
}
bool flag;
for(int i=0;i<n;i++)
{
flag=dfs(i+1);
if(flag==false)
{
cout<<"No\n";
goto out;
}
}
cout<<"Yes\n";
out:;
}
}