题目地址
题目大意
给一个无向图,再给每个结点涂一种颜色,判断相邻结点的颜色是否有相同。如果都不同输出颜色的总数量否则输出NO。
解题思路
- 给出的输入方式是常规的图输入方式,采用邻接表的方式存储图。
- 在定义一个vector存放每个结点的颜色。
- 定义一个set存放颜色,最后读取长度即可得到颜色类数。
- 单次判断时,只需要遍历每个结点的,判断每个结点和相邻结点是否出现同色的情况,用一个标记flag表示结果是否满足相邻颜色不同的条件,最后按照flag结果输出NO或者颜色。
完整代码
// A1154.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
#include "vector"
#include "set"
#include "iostream"
using namespace std;
vector<int> haha[10100];
vector<int> po;
set<int> ans;
int n,m,k;
int main(int argc, char* argv[])
{
cin>>n>>m;
int i;
for(i = 0;i < m;i++){
int u,v;
cin>>u>>v;
haha[u].push_back(v);
haha[v].push_back(u);
}
cin>>k;
while(k--){
po.clear();
ans.clear();
for(i = 0;i < n;i++){
int u;
cin>>u;
po.push_back(u);
ans.insert(u);
}
int flag = 0;
for(i = 0;i < n;i++){
for(int j = 0;j < haha[i].size();j++){
if(po[i] == po[haha[i][j]]){
flag = 1;
break;
}
if(flag == 1) break;
}
}
if(flag == 0)
printf("%d-coloring\n",ans.size());
else
printf("No\n");
}
//printf("Hello World!\n");
return 0;
}
总结
图,结点遍历问题,难度不大。欢迎评论区交流讨论。