整体思路其实并不难,比较巧妙地应该判断出相邻点颜色相同利用break进行No输出的时候是利用外函数写把二次循环变成一次循环。
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> v(510);
vector<int> color(510);
int n, e, k;
bool f(int i) //第i个顶点的连通情况
{
for(int j = 0; j < v[i].size(); j++)
{
if(color[i] == color[v[i][j]])
{
return false;
}
}
return true;
}
int main()
{
cin >> n >> e >> k; //点 边
while(e--)
{
int a, b;
cin >> a >> b;
v[a].push_back(b); //无向图
v[b].push_back(a);
}
int num;
cin >> num;
while(num--)
{
int flag = 0;
set<int> s; //检查颜色是否正确
for(int i = 1; i <= n; i++)
{
cin >> color[i];
s.insert(color[i]);
}
if(s.size() != k)
{
flag = 1;
cout << "No\n";
}
else
{
for(int i = 1; i < v.size(); i++)
{
if(f(i) == false)
{
flag = 1;
cout << "No\n";
break;
}
}
}
if(flag == 0) cout << "Yes\n";
}
return 0;
}