题目描述
解析
- 判定一个图是否为二分图:在遍历图的过程中,将与u相连的点“染色”为“与u相对的颜色”(此处把u染为1,则与它相连的点就染为-1。vis[i]表示i的染色情况,vis[i]初始化为0,表示开始时未被访问过。注意
负值和正值在if语句中是真,0才表示假
)
- 对于二分图中任意的一条边(u,v),u和v必定属于两个不同的集合。如果在访问的过程中发现u的出边已经被访问过且已经染上和u相同的颜色,则该图就不是二分图。上一张二分图感受一下>_<。
AC代码
class Solution {
public:
bool bfs(vector<vector<int>>& graph){
int n=graph.size();
vector<int> vis(n,0); / /vis[i]即对i点的染色,未染色的就为0
queue<int>que;
for(int i=0;i<n;i++){
/ /对每个结点开始bfs
if(vis[i]) continue; / /已经染色(访问过)就bfs下一个结点
vis[i]=1; / /设置为以访问,染色为“1”
que.push(i); / /加入队列
while(!que.empty()){
/ /队列不为空(还有连通的结点未访问)
int u=que.front();
que.pop(); / /队首的点出队
int color=vis[u]; / /记录当前点的“颜色”
for(int j=0;j<graph[u].size();j++){
if(vis[graph[u][j]]==0){
vis[graph[u][j]]=-color; / /将u的出边染为与u不同的颜色
que.push(graph[u][j]); / /将u的出边染色
}
else if(vis[graph[u][j]]==color) return false; / /与u相连的点已经被染色且颜色和u相同,说明图不是二分图
}
}
}
return true;
}
bool isBipartite(vector<vector<int>>& graph) {
return bfs(graph);
}
};