真是跪了,打开leetcode一看,图标签类型的题目就没有easy的。
- 判断二分图
核心思想:相邻的两个节点必须被分在两个不同的集合中。
DFS
class Solution {
public:
bool valid;
vector<int> colored;
bool isBipartite(vector<vector<int>>& graph) {
int n = graph.size();
colored.assign(n,0);
valid = true;
for (int i=0;i<n && valid;i++)
{
if(colored[i]==0)
{
dfs(i, 1, graph);
}
}
return valid;
}
void dfs(int i, int color, const vector<vector<int>>& graph)
{
colored[i] = color; //别忘了这一句!!!!
int nextColor = ((color == 1) ? 2 : 1);
for(auto& node:graph[i]){
if(colored[node]==0)
{
dfs(node, nextColor, graph);
if(!valid)
return;
}
else if(colored[node]==color)
{
valid = false;
return;
}
}
}
};
BFS
class Solution {
public:
bool isBipartite(vector<vector<int>>& graph) {
int n = graph.size();
vector<int> allNodeColor(n,0);
for(int i=0; i<n; i++)
{
if(allNodeColor[i]==0) //别忘了加这一句。
{
queue<int> q;
q.push(i);
allNodeColor[i] = 1;
while(!q.empty())
{
int curNode = q.front();
q.pop();
int nextColor = ((allNodeColor[curNode]==1) ? 2 : 1);
for(int neigbor : graph[curNode])
{
if(allNodeColor[neigbor] == 0)
{
q.push(neigbor);
allNodeColor[neigbor] = nextColor;
}
else if(allNodeColor[neigbor] != nextColor)
return false;
}
}
}
}
return true;
}
};
我放弃了。。。