本题实际上就是判断每一个点和周围点的颜色是否有一样的,所以用邻接链表存储一下,然后遍历即可
1
2
3
4
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
const int N=1010;
int n,m,c;
vector<int>G[N];
int color[N]={0};
// bool check(int v){
// bool flag=false;
// for(int i=0;i<G[v].size();i++){
// if(color[v]==color[G[v][i]]){
// flag=true;
// break;
// }
// }
// return flag;
// // bool flag=true;
// // for(int i=1;i<=n;i++){
// // for(int j=0;j<G[i].size();j++){
// // if(color[i]==color[G[i][j]]){
// // flag=false;
// // break;
// // }
// // }
// // if(flag==false)break;
// // }
// // return flag;
// }
int main()
{
cin>>n>>m>>c;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
int q;
cin>>q;
for(int i=0;i<q;i++){
memset(color,0,sizeof(color));
set<int>s;
for(int j=1;j<=n;j++){
cin>>color[j];
s.insert(color[j]);
}
if(s.size()!=c){
cout<<"No\n";
continue;
}
// bool flag=false;
// for(int j=1;j<=n;j++){
// flag=check(i);
// if(flag==true){
// break;
// }
// }
// if(flag==true)cout<<"Yes\n";
// else cout<<"No\n";
// // if(check())cout<<"Yes\n";
// // else cout<<"No\n";
bool flag=false;
for(int i=1;i<=n;i++){
for(int j=0;j<G[i].size();j++){
if(color[i]==color[G[i][j]]){
flag=true;
break;
}
}
if(flag==true)break;
}
if(flag==true)cout<<"No\n";
else cout<<"Yes\n";
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
const int N=1010;
int n,m,c;
vector<int>G[N];
int color[N]={0};
bool check(){
// bool flag=false;
// for(int i=0;i<G[v].size();i++){
// if(color[v]==color[G[v][i]]){
// flag=true;
// break;
// }
// }
// return flag;
bool flag=true;
for(int i=1;i<=n;i++){
for(int j=0;j<G[i].size();j++){
if(color[i]==color[G[i][j]]){
flag=false;
break;
}
}
if(flag==false)break;
}
return flag;
}
int main()
{
cin>>n>>m>>c;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
int q;
cin>>q;
for(int i=0;i<q;i++){
memset(color,0,sizeof(color));
set<int>s;
for(int j=1;j<=n;j++){
cin>>color[j];
s.insert(color[j]);
}
if(s.size()!=c){
cout<<"No\n";
continue;
}
// for(int j=1;j<=n;j++){
// flag=false;
// if(check(j)==true){
// flag=true;
// break;
// }
// }
// if(flag=true)cout<<"Yes\n";
// else cout<<"No\n";
if(check())cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
/*
6 8 3
2 1
1 3
4 6
2 5
2 4
5 4
5 6
3 6
4
1 2 3 3 1 2
4 5 6 6 4 5
1 2 3 4 5 6
2 3 4 2 3 4
*/
/*
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <cstring>
using namespace std;
const int N = 1010;
vector<int> G[N];
int n, m,l;
int color[N] = {0};
bool check(int i) {
for (int j = 0; j < G[i].size(); j++) {
if (color[i] == color[G[i][j]]);
return false;
}
return true;
}
int main() {
cin >> n >> m >> l;
for (int i = 0; i < m; i++) {
int a, b;//n个顶点,编号范围[1,n-1]
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
int q;
cin >> q;
//cout << q << endl;
set<int>s_c;
for (int i = 0; i < q; i++) {
memset(color, 0, sizeof(color));
s_c.clear();
for (int j = 1; j <=n; j++) {//顶点编号一一对应
scanf_s("%d", &color[j]);
s_c.insert(color[j]);
}
if (s_c.size() != l) {
cout << "No\n";
continue;
}
for (int i = 1; i <= n; i++) {//检查每个点周围的点是否符合条件
if (check(i) == false)
break;
}
if (i = n + 1)
cout << "Yes\n";
else
cout << "No\n";
}
return 0;
}
*/
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<vector>
#include<memory.h>
#include<set>
using namespace std;
const int max_n = 1e3;
int color[max_n];//存储点的颜色
int v, e, k;//顶点,边,颜色数
vector<int> edges[max_n];//存储边的信息
bool check() {
//检查每个点周围的点是否符合条件
bool flag = true;
for (int i = 1; i <= v; i++) {
for (int j = 0; j < edges[i].size(); j++) {
int next = edges[i][j];//临界点
if (color[i] == color[next]) {
flag = false;
//cout<<i<<" "<<color[i]<<" "<<next<<" "<<color[next]<<endl;
break;
}
}
if (flag == false) break;
}
return flag;
}
int main() {
cin >> v >> e >> k;
for (int i = 0; i < e; i++) {
int x, y;
cin >> x >> y;
edges[x].push_back(y);
edges[y].push_back(x);
}
int n;
cin >> n;
for (int i = 0; i < n; i++) {
memset(color, 0, sizeof(color));
set<int> s;
for (int j = 1; j <= v; j++) {
cin >> color[j];//输入点的颜色
s.insert(color[j]);
}
if (s.size() != k) {
cout << "No" << endl;
continue;
}
if (check()) {
//如果颜色都不同
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
}
return 0;
}