785. 判断二分图(Java)(DFS、BFS)

这篇博客探讨了如何使用DFS和BFS遍历框架来判断一个图是否为二分图。代码示例中展示了从每个未访问节点开始,通过染色和递归/广度优先遍历的方法,检查相邻节点是否满足二分图的条件。二分图的判断对于理解图的结构和算法设计有着重要的作用。
摘要由CSDN通过智能技术生成

还得是 DFS、BFS遍历框架
见注释

class Solution {
    private boolean ok = true;
    private boolean[] color;
    private boolean[] visited;
    public boolean isBipartite(int[][] graph) {
        int n = graph.length;
        color = new boolean[n];
        visited = new boolean[n];
        //每个节点开始遍历
        for(int v=0;v<n;v++){
            if(!visited[v]){
                //dfs(graph,v)
                bfs(graph,v);
            }
        }
        return ok;
    }
}

/*
    DFS
    public void dfs(int[][] graph,int v){
        //若已经判断非二分图,就直接结束该方法
        if(!ok){
            return;
        }
        //首先第一步就是将该点标记为已读
        visited[v] = true;
        //对该点所有相邻的点进行相反上色
        for(int w : graph[v]){
            //相邻节点没有被访问过
            if(!visited[w]){
                color[w] = !color[v];
                dfs(graph,w);
            }else{
                //访问过的就判断是否为二分图
                if(color[w] == color[v]){
                    ok = false;
                }
            }
        }
    }

*/
/*
    bfs
private void bfs(int[][] graph,int start){
        //使用队列
        Queue<Integer> q = new LinkedList<>();
        
        //将开头这个设置为true
        visited[start] = true;
        q.offer(start);
        //若队列不为空或仍是一个二分图
        while(!q.isEmpty() && ok){
            //将队列中的节点依次出队进行操作
            int v = q.poll();
            //所有相邻的都进行染色或判断
            for(int w:graph[v]){
                if(!visited[w]){
                    color[w] = !color[v];
                    visited[w] = true;
                    //染色后入队
                    q.offer(w);
                }else{
                    if(color[w] == color[v]){
                        ok= false;
                    }
                }
            }
        }
    }
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值