我收到此错误消息并且我知道它是因为数组中的参数必须是常量,但我不确定如何安排我的' this-> V;保持不变有帮助吗?我主要提供代码,以便指针变量的功能在整个程序中都很明显。
// A class that represents an undirected graph
class Graph
{
int V; // number of vertices
list<int> *adj; // A dynamic array of adjacency lists
int *in;
public:
// Constructor and destructor
Graph(int V);
~Graph() { delete[] adj; delete[] in; }
// function to add an edge to graph
void addEdge(int v, int w) { adj[v].push_back(w); (in[w])++; }
// Method to check if this graph is Eulerian or not
bool isEulerianCycle();
// Method to check if all non-zero degree vertices are connected
bool isSC();
// Function to do DFS starting from v. Used in isConnected();
void DFSUtil(int v, bool visited[]);
Graph getTranspose();
};
Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V];
in = new int[V];
for (int i = 0; i < V; i++)
in[i] = 0;
}
/* This function returns true if the directed graph has an eulerian
cycle, otherwise returns false */
bool Graph::isEulerianCycle()
{
// Check if all non-zero degree vertices are connected
if (isSC() == false)
return false;
// Check if in degree and out degree of every vertex is same
for (int i = 0; i < V; i++)
if (adj[i].size() != in[i])
return false;
return true;
}
// A recursive function to do DFS starting from v
void Graph::DFSUtil(int v, bool visited[])
{
// Mark the current node as visited and print it
visited[v] = true;
// Recur for all the vertices adjacent to this vertex
list<int>::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
if (!visited[*i])
DFSUtil(*i, visited);
}
// Function that returns reverse (or transpose) of this graph
// This function is needed in isSC()
Graph Graph::getTranspose()
{
Graph g(V);
for (int v = 0; v < V; v++)
{
// Recur for all the vertices adjacent to this vertex
list<int>::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
{
g.adj[*i].push_back(v);
(g.in[v])++;
}
}
return g;
}
// This function returns true if all non-zero degree vertices of
// graph are strongly connected
bool Graph::isSC()
{
// Mark all the vertices as not visited (For first DFS)
bool visited[V]; // error: 'this' cannot be used in a constant expression
for (int i = 0; i < V; i++)
visited[i] = false;
// Find the first vertex with non-zero degree
int n;
for (n = 0; n < V; n++)
if (adj[n].size() > 0)
break;
// Do DFS traversal starting from first non zero degree vertex.
DFSUtil(n, visited);
// If DFS traversal doesn't visit all vertices, then return false.
for (int i = 0; i < V; i++)
if (adj[i].size() > 0 && visited[i] == false)
return false;
// Create a reversed graph
Graph gr = getTranspose();
// Mark all the vertices as not visited (For second DFS)
for (int i = 0; i < V; i++)
visited[i] = false;
// Do DFS for reversed graph starting from first vertex.
// Staring Vertex must be same starting point of first DFS
gr.DFSUtil(n, visited);
// If all vertices are not visited in second DFS, then
// return false
for (int i = 0; i < V; i++)
if (adj[i].size() > 0 && visited[i] == false)
return false;
return true;
}
答案 0 :(得分:2)
C ++不支持非常量大小的数组。 (非常量表示在编译时未知的事物)。因此,该行的错误:
bool visited[V];
重写你的代码并坚持使用std容器(std :: vector,std :: list)。
class Graph
{
int V; // number of vertices
vector<list<int>> adj; // A dynamic array of adjacency lists
vector<int> in;
// etc...
// and you can access the elements just like a normal array (in[3] = 5, etc...)
Graph::Graph(int V)
{
this->V = V;
adj.Resize(V);
in.Resize(V);
// etc
vector<bool> visited(V);
希望这应该为修复代码提供一个良好的开端,并克服当前的错误。
修改
class Graph
{
vector<list<int>> adj; // A dynamic array of adjacency lists
vector<int> in;
public:
Graph(int V);
~Graph() { }
// function to add an edge to graph
void addEdge(int v, int w) { adj[v].push_back(w); (in[w])++; }
// Method to check if this graph is Eulerian or not
bool isEulerianCycle();
// Method to check if all non-zero degree vertices are connected
bool isSC();
// Function to do DFS starting from v. Used in isConnected();
void DFSUtil(int v, vector<bool>& visited);
Graph getTranspose();
};
Graph::Graph(int V)
{
adj.resize(V);
in.resize(V, 0);
}
/* This function returns true if the directed graph has an eulerian
cycle, otherwise returns false */
bool Graph::isEulerianCycle()
{
// Check if all non-zero degree vertices are connected
if (isSC() == false)
return false;
// Check if in degree and out degree of every vertex is same
for (size_t i = 0; i < adj.size(); i++)
if (adj[i].size() != in[i])
return false;
return true;
}
// A recursive function to do DFS starting from v
void Graph::DFSUtil(int v, vector<bool>& visited)
{
// Mark the current node as visited and print it
visited[v] = true;
// Recur for all the vertices adjacent to this vertex
for (auto i = adj[v].begin(); i != adj[v].end(); ++i)
if (!visited[*i])
DFSUtil(*i, visited);
}
Graph Graph::getTranspose()
{
Graph g(adj.size());
for (int v = 0; v < adj.size(); v++)
{
// Recur for all the vertices adjacent to this vertex
//list<int>::iterator i;
for (auto i = adj[v].begin(); i != adj[v].end(); ++i)
{
g.adj[*i].push_back(v);
(g.in[v])++;
}
}
return g;
}
// This function returns true if all non-zero degree vertices of
// graph are strongly connected
bool Graph::isSC()
{
// Mark all the vertices as not visited (For first DFS)
vector<bool> visited(adj.size(), false);
// Find the first vertex with non-zero degree
int n;
for (n = 0; n < adj.size(); n++)
if (adj[n].size() > 0)
break;
// Do DFS traversal starting from first non zero degree vertex.
DFSUtil(n, visited);
// If DFS traversal doesn't visit all vertices, then return false.
for (int i = 0; i < adj.size(); i++)
if (adj[i].size() > 0 && visited[i] == false)
return false;
// Create a reversed graph
Graph gr = getTranspose();
// Mark all the vertices as not visited (For second DFS)
visited.resize(visited.size(), false);
// Do DFS for reversed graph starting from first vertex.
// Staring Vertex must be same starting point of first DFS
gr.DFSUtil(n, visited);
// If all vertices are not visited in second DFS, then
// return false
for (int i = 0; i < adj.size(); i++)
if (adj[i].size() > 0 && visited[i] == false)
return false;
return true;
}
答案 1 :(得分:1)
而不是
bool visited[V];
标准C ++不支持,例如。
std::vector<bool> visited(V);
您必须包含<vector>
标头才能使用std::vector
。