题意转换->将所有节点分成两组,每条边两个结点分别来自两组。
思路:dfs染色(两种)。 每条边两个结点染不同的颜色(1 / -1),若两端结点颜色一致 则 return false
注意:可能不是连通图->多次dfs
class Solution {
public:
int color[105] = {0};
int dfs(vector<vector<int>>& graph, int colr, int m) {
color[m] = colr;
int next = (colr == 1 ? -1 : 1);
for (auto& a : graph[m]) {
if (color[a] == color[m]) return false;
if (abs(color[a] - color[m]) == 2) continue;
if (!dfs(graph, next, a)) return false;
}
return true;
}
bool isBipartite(vector<vector<int>>& graph) {
int n = graph.size();
for (int i = 0; i < n; ++i) {
if (!color[i] && !dfs(graph, 1, i)) return false;
}
return true;
}
};
代码二的写法:bfs,队头和即将入队的两个元素颜色不一致即可