用染色法判断是不是二分图
如何理解return的两种位置
/* 图遍历框架 */
boolean[] visited;
void traverse(Graph graph, int v) {
// 防止走回头路进入死循环
if (visited[v]) return;
// 前序遍历位置,标记节点 v 已访问
visited[v] = true;
for (Vertex neighbor : graph.neighbors(v))
traverse(graph, neighbor);
}
这个是无论三七二十一都把它加进去,反正加进去之后方法开头会判断visited
/* 图遍历框架 */
boolean[] visited;
void traverse(Graph graph, int v) {
// 前序遍历位置,标记节点 v 已访问
visited[v] = true;
for (int neighbor : graph.neighbors(v)) {
if (!visited[neighbor]) {
// 只遍历没标记过的相邻节点
traverse(graph, neighbor);
}
}
}
这个是在刚找到相邻节点时候就筛选,我只要没标记过的相邻节点进去
这是我自己写的
1.首先这里dfs和bfs都行
2.然后我从左侧第一个开始traverse,如果左侧第一个traverse的DFS结束,看左侧第二个如果已经被染了就跳过(我这里的目的就是把所有点染好色就行,我在染色过程中都已经实时判断了,所以只要左侧·都染好了我就不用了再DFS)--》
class Solution {
private boolean res=true;
private boolean[] visited;
private boolean[] color;
public boolean isBipartite(int[][] graph) {
int n =graph.length;
color = new boolean[n];
visited = new boolean[n];
for(int i=0;i<n;i++)
{
if(!visited[i])
traverse(graph,i);
}
return res;
}
//进入traverse前v就染色了,进入traverse后v再标记vitsited,只加入未标记的相邻节点
public void traverse(int[][] graph,int v)
{
visited[v] = true;
for(int w: graph[v])
{
if(!visited[w])
{
color[w] = !color[v];
traverse(graph,w);
}
else{
if(color[w] == color[v])
res = false;
}
}
}
}