思路:染色法二分图模板题。
代码:
0)技巧:color在1和2之间不断转变,可以用3^来实现转变过程。3^1=2,3^2=1。
1)dfs:
class Solution {
bool dfs(int idx,int nowColor,vector<int>& color,vector<vector<int>>& g){
color[idx]=nowColor;
for(auto &it:g[idx]){
if(color[it]!=0&&color[it]==color[idx]){
return false;
}
if(color[it]==0&&!dfs(it,3^nowColor,color,g)){
return false;
}
}
return true;
}
public:
bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
vector<int> color(n+1,0);
vector<vector<int>> g(n+1);
for(auto &it:dislikes){
g[it[0]].push_back(it[1]);
g[it[1]].push_back(it[0]);
}
for(int i=1;i<=n;i++){
if(color[i]==0&&!dfs(i,1,color,g)){
return false;
}
}
return true;
}
};
2)bfs:
class Solution {
public:
bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
vector<int> color(n+1,0);
vector<vector<int>> g(n+1);
for(auto &it:dislikes){
g[it[0]].push_back(it[1]);
g[it[1]].push_back(it[0]);
}
for(int i=1;i<=n;i++){
if(color[i]==0){
queue<int> q;
q.push(i);
color[i]=1;
while(!q.empty()){
int tmp=q.front();
q.pop();
for(auto &it:g[tmp]){
if(color[it]>0&&color[it]==color[tmp]){
return false;
}
if(color[it]==0){
color[it]=3^color[tmp];
q.push(it);
}
}
}
}
}
return true;
}
};