这段代码有什么问题,它检查 2 个可着色图(二分图)
What's wrong with this code which checks for 2 colourable graph (bipartite)
我写了一段代码来检查给定的图是否是二分图,但不确定为什么一个代码有效而另一个无效。
以下无效,
bool dfs(int i, int color, vector<vector<int>> &graph) {
if (visited[i] == -1) {
visited[i] = color;
for (int adj: graph[i])
return dfs(adj, !color, graph);
}
return (visited[i] == color);
}
bool isBipartite(vector<vector<int>> &graph) {
visited.assign(105, -1);
for (int i = 0; i < graph.size(); i++) {
if (visited[i] == -1)
if (!dfs(i, 0, graph)) return false;
}
return true;
}
vector<int> visited;
但是当我把上面改成这个的时候
bool dfs(int i, int color, vector<vector<int>> &graph) {
if (visited[i] == -1) {
visited[i] = color;
for (int adj: graph[i])
if (!dfs(adj, !color, graph)) {
return false;
}
}
return (visited[i] == color);
}
bool isBipartite(vector<vector<int>> &graph) {
visited.assign(105, -1);
for (int i = 0; i < graph.size(); i++) {
if (visited[i] == -1)
if (!dfs(i, 0, graph)) return false;
}
return true;
}
vector<int> visited;
有效,谁能告诉我为什么?请注意,dfs 函数中只有第 5 行和第 6 行发生了更改。
这两个代码不应该工作吗,因为它们似乎工作相同?
在您的第一个代码片段中,
for (int adj: graph[i])
return dfs(adj, !color, graph);
您在 for 循环的第一次迭代中返回。因此,对于每个节点,您只检查其邻居之一,而忽略其余节点。
请注意,您的第二个代码段也不完全正确。你错过了节点没有邻居的情况,或者它的所有邻居都有正确的颜色:
bool dfs(int i, int color, vector<vector<int>> &graph) {
if (visited[i] == -1) {
visited[i] = color;
for (int adj: graph[i])
if (!dfs(adj, !color, graph)) {
return false;
}
return true;
}
return (visited[i] == color);
}
我写了一段代码来检查给定的图是否是二分图,但不确定为什么一个代码有效而另一个无效。
以下无效,
bool dfs(int i, int color, vector<vector<int>> &graph) {
if (visited[i] == -1) {
visited[i] = color;
for (int adj: graph[i])
return dfs(adj, !color, graph);
}
return (visited[i] == color);
}
bool isBipartite(vector<vector<int>> &graph) {
visited.assign(105, -1);
for (int i = 0; i < graph.size(); i++) {
if (visited[i] == -1)
if (!dfs(i, 0, graph)) return false;
}
return true;
}
vector<int> visited;
但是当我把上面改成这个的时候
bool dfs(int i, int color, vector<vector<int>> &graph) {
if (visited[i] == -1) {
visited[i] = color;
for (int adj: graph[i])
if (!dfs(adj, !color, graph)) {
return false;
}
}
return (visited[i] == color);
}
bool isBipartite(vector<vector<int>> &graph) {
visited.assign(105, -1);
for (int i = 0; i < graph.size(); i++) {
if (visited[i] == -1)
if (!dfs(i, 0, graph)) return false;
}
return true;
}
vector<int> visited;
有效,谁能告诉我为什么?请注意,dfs 函数中只有第 5 行和第 6 行发生了更改。
这两个代码不应该工作吗,因为它们似乎工作相同?
在您的第一个代码片段中,
for (int adj: graph[i])
return dfs(adj, !color, graph);
您在 for 循环的第一次迭代中返回。因此,对于每个节点,您只检查其邻居之一,而忽略其余节点。
请注意,您的第二个代码段也不完全正确。你错过了节点没有邻居的情况,或者它的所有邻居都有正确的颜色:
bool dfs(int i, int color, vector<vector<int>> &graph) {
if (visited[i] == -1) {
visited[i] = color;
for (int adj: graph[i])
if (!dfs(adj, !color, graph)) {
return false;
}
return true;
}
return (visited[i] == color);
}