简单题
题意
相邻两个点不能是相同颜色 给出使用颜色的数量or输出No
思路
用邻接矩阵存图,遍历所有边,check两点颜色是否相同,在每一次输入颜色的时候就统计颜色数量
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
vector<int> g[10005];
map<long int,int> mmap;
int color[10005];
int cnt;
int legal;
int main(){
int n,m,k;
int a,b;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
}
scanf("%d",&k);
for(int i=0;i<k;i++){
mmap.clear();
cnt=0;
legal=1;
for(int j=0;j<n;j++){
scanf("%d",&color[j]);
if(mmap.find(color[j])==mmap.end()){
mmap[color[j]] = 1;
cnt++;
}
}
for(int j=0;j<n;j++){
for(int l=0;l<g[j].size();l++){
if(color[j]==color[g[j][l]])
legal=0;
}
}
if(legal) printf("%d-coloring\n",cnt);
else printf("No\n");
}
return 0;
}
易错点:
我一开始错在几个段错误
- 颜色的数值是int范围内的,所以开flag数组不可,用map就可
color[]
开到1w+才行- 总之要注意数据范围!
- 我用的是map,事实上用set也很妙
- 甚至不建图都可以,用一个struct把所有边拉成一个数组之后遍历也很不错,简洁!