PAT 1154 Vertex Coloring
作者:互联网
这一题是图上的每个点涂上颜色,如果相连的点的颜色都不同就是k-coloring,k是颜色的种类,如有相同则不是。
原来以为是用BFS,发现图上每一个点不一定都连在一起。直接对每个点的相连的点进行遍历,已经遍历过的点标记一下,判断是否相连的点的颜色有相同。
在写这一题的时候还去查了一下int n=10; int a[10];
为什么这段代码可以运行,以前书上说是不可以运行。后来发现是c++新的标准。
我原来写set插入元素都先判断是否存在然后插入,现在看到别人是直接插入,发现这样也可以。看了一下《c++primer》发现是可以的,记录一下。
#include <bits/stdc++.h>
using namespace std;
void isSame(int length,int color[],vector<int> vec[])
{
int vis[length] = {0};
int index = 0;
bool same = false;
for(int j=0;j<length;j++){
if(!vis[j]) {
vis[j] = 1;
for(int i=0; i<vec[j].size(); i++) {
index = vec[j][i];
if(!vis[index]) {
if(color[j] == color[index]) {
same = true;
break;
}
}
}
if(same) {
break;
}
}
}
if(same) {
printf("No\n");
} else {
set<int> colorSets;
for(int i=0; i<length; i++) {
colorSets.insert(color[i]);
}
printf("%d-coloring\n",colorSets.size());
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
vector<int> vec[n];
int x,y;
for(int i=0; i<m; i++) {
scanf("%d%d",&x,&y);
vec[x].push_back(y);
vec[y].push_back(x);
}
int color[n]= {0};
int k;
scanf("%d",&k);
for(int i=0; i<k; i++) {
for(int j=0; j<n; j++) {
scanf("%d",&color[j]);
}
isSame(n,color,vec);
}
return 0;
}
Genius_J
发布了82 篇原创文章 · 获赞 6 · 访问量 3万+
私信
关注
标签:10,Coloring,PAT,int,1154,c++,length,vec,颜色 来源: https://blog.csdn.net/Genius_J/article/details/104107219