题目描述
知识点
图的着色
实现
码前思考
- 这道题考点就是图的遍历DFS~,跟二部图的着色问题很类似;
- 记得提前设置一个
flag
变量,一旦出现不匹配就立刻停止DFS,这样时间会好一些。
代码实现
//顶点下标从0开始编号
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e4+10;
vector<int> adj[maxn];
//表示是否被访问
bool vis[maxn];
//颜色数组
int color[maxn];
int n;
int m;
int k;
bool flag;
unordered_set<int> colorSet;
//进行DFS
void DFS(int root){
//如果当前结点没有被访问
if(vis[root] == false && flag == true){
vis[root] = true;
//查看它的子节点
for(int i=0;i<adj[root].size()&&flag;i++){
//如果颜色相互冲突
if(color[root] == color[adj[root][i]]){
flag = false;
}else{
//不相同则递归
DFS(adj[root][i]);
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int u;
int v;
scanf("%d %d",&u,&v);
adj[u].push_back(v);
adj[v].push_back(u);
}
scanf("%d",&k);
for(int i=0;i<k;i++){
fill(vis,vis+maxn,false);
colorSet.clear();
int maxNum=-1;
for(int i=0;i<n;i++){
scanf("%d",&color[i]);
colorSet.insert(color[i]);
}
//代表满足条件
flag = true;
//进行DFS
for(int i=0;i<n;i++){
if(flag == true){
//注意不同的连通块
if(vis[i] == false){
DFS(i);
}
}else{
break;
}
}
if(flag == true){
printf("%d-coloring\n",colorSet.size());
}else{
printf("No\n");
}
}
return 0;
}
码后反思
-
omg,柳神是枚举边的,太牛了(๑•̀ㅂ•́)و✧
#include <iostream> #include <vector> #include <set> using namespace std; struct node {int t1, t2;}; int main() { int n, m, k; cin >> n >> m; vector<node> v(m); for (int i = 0; i < m; i++) scanf("%d %d", &v[i].t1, &v[i].t2); cin >> k; while (k--) { int a[10009] = {0}; bool flag = true; set<int> se; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); se.insert(a[i]); } for (int i = 0; i < m; i++) { if (a[v[i].t1] == a[v[i].t2]) { flag = false; break; } } if (flag) printf("%d-coloring\n", se.size()); else printf("No\n"); } return 0; }
二刷代码
忘记DFS时要求不同的连通块了!!! 这很危险啊。DFS的一大坑点就是可能会有不同的连通块哦!
虽然代码思想都懂,但是现在思考问题显然没有以前那么认真了。。。。。。
//就是图的遍历吧
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 1e4+10;
vector<int> adj[maxn];
bool vis[maxn];
int color[maxn];
int n,m;
set<int> st;
bool dfs(int root){
vis[root]=true;
//访问所有的邻接结点
for(int i=0;i<adj[root].size();i++){
int v= adj[root][i];
if(color[v]==color[root]){
return false;
}else{
if(vis[v]==false){
bool flag = dfs(v);
if(flag==false){
return false;
}
}
}
}
return true;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
adj[u].push_back(v);
adj[v].push_back(u);
}
int k;
scanf("%d",&k);
for(int i=0;i<k;i++){
st.clear();
fill(vis,vis+maxn,false);
for(int j=0;j<n;j++){
scanf("%d",&color[j]);
st.insert(color[j]);
}
bool flag=true;
for(int j=0;j<n;j++){
if(vis[j]==0){
if(dfs(j)==false){
flag=false;
}
}
}
if(flag){
printf("%d-coloring\n",st.size());
}else{
printf("No\n");
}
}
return 0;
}