题目
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, 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
题目大意
给出一幅图,并且给出图中每个顶点的颜色,如果有邻接的两个顶点颜色相同,输出no,否则输出一共有几种颜色。
直觉
虽然是一道图的题,但是好像没有考任何算法,甚至不需要把图给存下来。
只需要用结构体数组把所有的边都存下来,然后再开一个数组存放每个节点的颜色。
遍历每条边,从边的结构体中取出它所连接的两个顶点的数字,再看看颜色数组中,这两个顶点颜色是否相同即可。
复杂度分析
O(kM),其实算法复杂度应该只有O(M),但是题目需要你判断k组数据。
代码
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int first;
int second;
}node;
const int maxn=10010;
int N,M;
node vertex[maxn];
int main(){
cin>>N>>M;
int temp1,temp2;
for(int i=0;i<M;++i){
cin>>temp1>>temp2;
vertex[i].first =temp1;
vertex[i].second=temp2;
}
int k;
cin>>k;
int color[N];
for(int i=0;i<k;++i){
int flag=0;
set<int> num;
num.clear();
for(int j=0;j<N;++j){
cin>>color[j];
num.insert(color[j]);
}
for(int j=0;j<M;++j){
if(color[vertex[j].first ]==color[vertex[j].second ]){
cout<<"No";
if(i<k-1)cout<<endl;
flag=1;
break;
}
}
if(flag==0){
cout<<num.size()<<"-coloring";
if(i<k-1)cout<<endl;
}
}
return 0;
}
提交时间 状态 分数 题目 编译器 耗时 用户
2019/8/25 20:04:50
答案正确
25 1154 C++ (g++) 825 ms Chester
测试点 结果 耗时 内存
0 答案正确 3 ms 412 KB
1 答案正确 4 ms 356 KB
2 答案正确 825 ms 904 KB
3 答案正确 623 ms 504 KB