A proper vertex coloring is a labeling of the graph's vertices with colors such that no two vertices sharing the same edge have the same color. A coloring using at most k colors is called a (proper) k-coloring.
Now you are supposed to tell if a given coloring is a proper k-coloring.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers N and M (both no more than 104), being the total numbers of vertices and edges, respectively. Then M lines follow, each describes an edge by giving the indices (from 0 to N−1) of the two ends of the edge.
After the graph, a positive integer K (≤ 100) is given, which is the number of colorings you are supposed to check. Then K lines follow, each contains N colors which are represented by non-negative integers in the range of int. The i-th color is the color of the i-th vertex.
Output Specification:
For each coloring, print in a line k-coloring
if it is a proper k
-coloring for some positive k
, or No
if not.
Sample Input:
10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 0
2 4
4
0 1 0 1 4 1 0 1 3 0
0 1 0 1 4 1 0 1 0 0
8 1 0 1 4 1 0 5 3 0
1 2 3 4 5 6 7 8 8 9
Sample Output:
4-coloring
No
6-coloring
No
这道题其实思路很简单,就是给你一个图,然后给你几行测试数据,每行有0-n-1个数字,每个数字代表一种颜色,在第i个位置上的颜色就是给第i个顶点的,要求你判断符合条件的图,即每条边的两个顶点颜色不同,符合条件就输出颜色的种类数,不符合就输出no,在我做的过程中,我认为需要注意的是颜色编号的范围是非负的int,这里我做了两种处理,一种是自己编写的一个判断,而另一种是利用set集合,set集合有个特性,一个set里面的各元素是各不相同的,并且set会按照元素进行从小到大排序。一开始在这点想利用数组标记呢,结果没过去,只有23分,在最后我贴出了我23分的代码,希望大家不要犯这种错误。
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int a,b;
};
int main(){
int n,m;
scanf("%d %d",&n,&m);
vector<node> v(m);
for(int i = 0;i < m;i++){
scanf("%d %d",&v[i].a,&v[i].b);
}
int k;
scanf("%d",&k);
while(k--){
int q[10001]={0};
for(int i = 0;i < n;i++){
scanf("%d",&q[i]);
}
int flag = 0;
for(int i = 0;i < m;i++){
if(q[v[i].a] == q[v[i].b]){
flag = 1;
break;
}
}
if(flag == 1){
printf("No\n");
}else{
int count = 1;
sort(q,q+n);
for(int i = 1;i < n;i++){ //自己写的判断
if(q[i] == q[i-1]){
}else{
count++;
}
}
printf("%d-coloring\n",count);
}
}
return 0;
}
#include<iostream>
#include<vector>
#include<set>
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int a,b;
};
int main(){
int n,m;
scanf("%d %d",&n,&m);
vector<node> v(m);
for(int i = 0;i < m;i++){
scanf("%d %d",&v[i].a,&v[i].b);
}
int k;
scanf("%d",&k);
while(k--){
set<int> book;
int q[10001]={0};
for(int i = 0;i < n;i++){
scanf("%d",&q[i]);
book.insert(q[i]); //利用set集合
}
int flag = 0;
for(int i = 0;i < m;i++){
if(q[v[i].a] == q[v[i].b]){
flag = 1;
break;
}
}
if(flag == 1){
printf("No\n");
}else{
printf("%d-coloring\n",book.size());
}
}
return 0;
}
最后是23分的代码.,我之前不正确的处理方法
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int a,b;
};
int main(){
int n,m;
scanf("%d %d",&n,&m);
vector<node> v(m);
for(int i = 0;i < m;i++){
scanf("%d %d",&v[i].a,&v[i].b);
}
int k;
scanf("%d",&k);
while(k--){
int q[10001]={0};
int book[14990];
memset(book,-1,sizeof(book));
for(int i = 0;i < n;i++){
scanf("%d",&q[i]);
book[q[i]] = 1;
}
int flag = 0;
for(int i = 0;i < m;i++){
if(q[v[i].a] == q[v[i].b]){
flag = 1;
break;
}
}
if(flag == 1){
printf("No\n");
}else{
int count = 0;
for(int i = 0;i < 14990;i++){//都遍历到14990了还是过不去,不过猜测这
if(book[i] != -1){ //个编号在14000-14990之间,当然也可能
count++; //更大........
}
}
printf("%d-coloring\n",count);
}
}
return 0;
}