题目描述
结果
知识点
图的遍历BFS+DFS,二分图
实现
码前思考
- 二分图题就是图顶点着色问题,就是在图DFS上增加一些额外的操作,模板还是DFS的!
- 注意非连通图的情况!
代码实现
//数组下标从1开始
class Solution {
private:
const static int maxn = 2010;
vector<int> adj[maxn];
int color[maxn];
bool flag;
public:
bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
//初始化参数
fill(color,color+maxn,-1);
flag = true;
//构建邻接表
for(int i=0;i<dislikes.size();i++){
int u = dislikes[i][0];
int v = dislikes[i][1];
adj[u].push_back(v);
adj[v].push_back(u);
}
//开始进行DFS
for(int i=1;i<=N;i++){
if(flag == false){
break;
}else{
if(color[i] == -1){
DFS(i,0);
}
}
}
return flag;
}
void DFS(int root,int c){
if(flag == false){
return;
}else{
if(color[root]!=-1){
if(color[root] != c){
flag = false;
return;
}else{
return;
}
}else{
color[root] = c;
for(int i=0;i<adj[root].size();i++){
DFS(adj[root][i],1-c);
}
}
}
}
};
码后反思
- 原来还可以用并查集来做!!!对呀,对于这种集合划分的问题,难道不就是并查集的主场吗!!!
- 但是并查集貌似不太好解?我就没看了网友题解