graph - 谁能发现该代码有什么问题?
问题描述
我一直在尝试解决 coursera 的问题。
问题描述:给定一个有顶点和边的无向图,检查它是否是二分图。
输入格式。图表以标准格式给出。
约束。1 ≤ ≤ 105, 0 ≤ ≤ 105。输出格式。如果图是二分图则输出 1,否则输出 0。
Input:
4 4
1 2
4 1
2 3
3 1
Output:
0
Input:
5 4
5 2
4 2
3 4
1 4
Output:
1
我想出了一个看起来像 C++ 的解决方案
#include <bits/stdc++.h>
using namespace std;
#define vvi vector<vector<int>>
#define vi vector<int>
#define qi queue<int>
int bfs(vvi adj, int s, vi &disc, vi &dist)
{
disc[s] = 1; dist[s] = 0;
qi q;
q.push(s);
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i: adj[u])
{
if(!disc[i])
{
disc[i] = 1;
q.push(i);
dist[i] = dist[u]+1;
}else if(dist[u]==dist[i])
{
return 0;
}
}
}
return 1;
}
bool isBipartite(vvi adj, vi &disc, vi &dist)
{
for(int i=0;i<adj.size();++i)
{
if(!disc[i])
{
if(!bfs(adj, i, disc, dist))
{
return 0;
}
}
}
return 1;
}
int main()
{
int n, m;
cin >> n >> m;
vvi adj(n);
for(int i=0;i<m;++i)
{
int x, y;
cin >> x >> y;
adj[x-1].push_back(y-1);
adj[y-1].push_back(x-1);
}
vi dist(n);
vi disc(n, 0);
cout << isBipartite(adj, disc, dist);
}
但是这个解决方案在测试用例 3 上产生了错误的答案。谁能弄清楚我在那个代码中遗漏了什么?提前致谢。♥</p>
解决方案
您的逻辑似乎完美无缺,可能是错误原因:您没有将adj参数作为参考传递。这意味着对于bfs方法的每次调用,该图都将被复制。如果第三个测试用例是一个孤立的图(没有边),那将是不好的。有时运行时错误和内存超出错误被在线判断视为不存在的错误答案。
推荐阅读
- amazon-web-services - 在 AWS 上创建激活时出现错误消息“不存在角色”
- drools - (决策电子表格)当属性应用于电子表格时,它不能转换为决策表
- python-3.x - Python,如何从一个列表中删除一个项目并将其添加到另一个?
- xml - 将外部 XML 文件作为 PSQL 脚本中的变量访问(源自 bash 脚本)
- ios - 在后台运行 JSON 请求 Swift 4
- ms-access-2010 - 如果可能,不使用 3rd 方应用程序恢复 Microsoft 访问记录的可能性
- python-3.x - 如何将列表的元素按顺序放入标签矩阵中?
- javascript - 在 HTML 对象标签中添加 CSS 宽度
- haskell - GHCi 中的 Haskell 语句被中断似乎破坏了 cmd
- c# - 字符串未被识别为有效的 DateTime 格式异常