1154 Vertex Coloring
题目大意
给定n个顶点,m条边的图。给定每个顶点的着色情况,判断此图是否是k-coloring图。
思路
- 采用邻接矩阵的方式存储这一张图
- 定义数组color存放每个顶点的着色,集合s统计颜色数量。对于每一组判断,判断有没有在一条边两端的顶点的着色是相同的,如果是,它就不满足k-coloring图,如果所有边两端的顶点的着色都不同,它就是k-coloring图。
代码
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int maxn=10005;
int n,m;
vector<int> v[maxn];//下标为顶点下标,值为与它相连的顶点编号
int main(){
cin>>n>>m;
int ans1,ans2;
for(int i=0;i<m;i++){
cin>>ans1>>ans2;
v[ans1].push_back(ans2);
v[ans2].push_back(ans1);
}
int k;
cin>>k;
int color[maxn];//下标为顶点编号,值为该点的颜色
set<int> s;//统计本组测试样例的颜色
while(k--){
for(int i=0;i<n;i++){
cin>>color[i];
s.insert(color[i]);
}
int flag=0;//判断边的两个顶点颜色是否相同。初始化为不相同
for(int i=0;i<n;i++){
for(int j=0;j<v[i].size();j++){
if(color[i]==color[v[i][j]]){
flag=1;
break;
}
}
if(flag) break;
}
if(flag){
cout<<"No"<<endl;
}else{
cout<<s.size()<<"-coloring"<<endl;
}
s.clear();
}
}