c++ - 图上的深度优先搜索算法中的内存泄漏
问题描述
我在 Coursera 上做一门课程,他们要求实施 DFS 以查看图的两个顶点是否连接。我想出了代码,它在我的笔记本电脑上给出了正确的输出,但在他们的分级机上给出了不正确的输出。几天来,我一直在为这个问题头疼,完全不知道我哪里出错了。代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Graph
{
public:
vector<int> adj; //adjacency list
void add(int a)
{
adj.push_back(a);
}
void DFS(bool visited[],int n,Graph G[],int v)
{
for(int i=0;i<G[v].adj.size();i++)
{
int vert=G[v].adj[i];
if(visited[vert]==false)
{
visited[vert]=true;
DFS(visited,n,G,vert);
}
}
}
};
int main()
{
int n,m;
cin>>n>>m;//No. of vertices,number of edges
bool visited[n];
for(int i=0;i<n;i++)
visited[n]=false;
Graph G[n];
for(int i=0;i<m;i++)
{
int u,v;
cin>>u>>v; //The vertices joined by two edges
G[u-1].add(v-1);
G[v-1].add(u-1);
}
int k,l;
cin>>k>>l; //The vertices to be checked if they are connected
G[k-1].DFS(visited,n,G,k-1);
if(visited[l-1]==true)
cout<<1;
else
cout<<0;
}
分级机输出:
Failed case #2/16: (Wrong answer)
Input:
4 2
1 2
3 2
1 4
Your output:
1
Correct output:
0
(Time used: 0.00/1.00, memory used: 7839744/536870912.)
如果我在笔记本电脑上运行上述案例,它的输出为 0,即预期的答案。我在论坛上问了这个问题,他们说有一些我无法识别的内存泄漏。请帮忙。
解决方案
如果您正在编写一个Graph
类,那么您应该真正将所有功能封装在该类中。你不应该压倒这个main
功能。它使您的代码复杂。另外,在函数调用的情况下,您不必传递很多东西。避免使用using namespace std;
,因为它会导致命名空间冲突。为避免编写std::cout
or std::cin
,请考虑using std::cout
and using std::cin
。我重构了你的代码,现在它给出了正确的输出:
#include <iostream>
#include <cstring>
#include <vector>
using std::cout;
using std::cin;
class Graph
{
public:
static constexpr int MAXN = 100;
std::vector <int> adj[MAXN + 1]; //adjacency list
int visited[Graph::MAXN + 1]; // for 1 based indexing
Graph(){
for(int i = 0 ; i <= MAXN ; ++i) adj[i].clear();
memset(visited, 0, sizeof(visited));
}
void addEdge(bool isDirected, int u, int v)
{
adj[u].push_back(v);
if(!isDirected) adj[v].push_back(u);
}
void takeInput(bool isDirected, int nodes, int edges){
for(int i = 0 ; i < edges ; i++){
int u,v; cin >> u >> v;
addEdge(isDirected, u, v);
}
}
void DFS(int source)
{
visited[source] = 1;
for(int i = 0 ; i < adj[source].size() ; ++i){
int adjNode = adj[source][i];
if(visited[adjNode] == 0){
DFS(adjNode);
}
}
}
bool isConnected(int source, int destination){
DFS(source - 1);
return visited[destination - 1];
}
};
int main()
{
int nodes, edges;
cin >> nodes >> edges;//No. of vertices,number of edges
Graph g;
g.takeInput(false, nodes, edges);
int source, destination;
cin >> source >> destination; //The vertices to be checked if they are connected
cout << g.isConnected(source, destination) << '\n';
return 0;
}
推荐阅读
- bash - 试图让用户看到letsencrypt密钥
- c++ - 如何使用openssl EVP解密?
- linker - 使用 arm-none-eabi-gcc 编译器为 RaspberryPI2 和 BeableBoneBlack 编译 sqrt 函数时出错
- r - R Barplot Animation 截断的条形图
- asp.net - 如何使用 axios.put 将 JSON 发送到 ASP.NET 控制器
- python - 如何使用 Python 中的排序算法对列表字典进行排序?
- r - 如何使用 R 以摘要格式构造数据
- c# - ASP.Net Core、Entity Framework 和 MySQL 给出了 Create 异常?任何想法为什么?
- database - Entity Framework Core 一对多相关数据导航属性始终为空
- python - python gpg.decrypt 输出文件为空