【leetcode】785. 判断二分图 (二分图&bfs)

题目描述

【leetcode】785. 判断二分图 (二分图&bfs)_第1张图片【leetcode】785. 判断二分图 (二分图&bfs)_第2张图片

解析

  • 判定一个图是否为二分图:在遍历图的过程中,将与u相连的点“染色”为“与u相对的颜色”(此处把u染为1,则与它相连的点就染为-1。vis[i]表示i的染色情况,vis[i]初始化为0,表示开始时未被访问过。注意负值和正值在if语句中是真,0才表示假
  • 对于二分图中任意的一条边(u,v),u和v必定属于两个不同的集合。如果在访问的过程中发现u的出边已经被访问过且已经染上和u相同的颜色,则该图就不是二分图。上一张二分图感受一下>_<。
    【leetcode】785. 判断二分图 (二分图&bfs)_第3张图片

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);
    }
};

你可能感兴趣的:(bfs,算法,队列,图论,leetcode)