1

我正在尝试编写一个函数,它将两个图作为参数,如果它们是补码,则返回 true,否则返回 false。我认为如果一个图形的倒数与另一个匹配,那是我尝试使用的方法。我在一个类上构建了我的函数,出于某种原因,它只是不允许我从主函数中调用它。我什至无法检查我的功能是否有效。我尝试更改名称和引用,但我总是收到一条消息:使用未声明的标识符“is_complement”。

这是我的代码:

#include <iostream>
#include <list>

using namespace std;

class Graph
{
    int num_of_vertices;
    list<int> *adj;
    void DFSrecursive (int n, bool visited[]);



public:
    Graph(int numm_of_vertices);
    void addEdge(int n, int m);
    Graph ReverseGraph();
    bool is_complement(Graph g1, Graph g2);

};

int main()
{
    //Test graph 1
    Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(1, 2);
    g.addEdge(2, 3);
    g.addEdge(0, 2);

    //Test graph 2
    Graph g1(4);
    g1.addEdge(0, 1);
    g1.addEdge(1, 2);
    g1.addEdge(2, 3);
    g1.addEdge(0, 2);


    cout<< is_complement(g,g1) <"\n";

    return 0;
}

Graph::Graph(int V)
{
    this->num_of_vertices = V;
    adj = new list<int>[V];
}

void Graph::addEdge(int n, int m)
{
    adj[n].push_back(m);
    adj[m].push_back(n);
}


bool Graph::is_complement(Graph g1, Graph g2)
{
    Graph ga=g1;
    Graph gr=g2;
    bool flag=false;

    gr = ReverseGraph();

    for (int i=0; i<num_of_vertices; i++)
   {
       if (ga.adj[i]==gr.adj[i])
       {
           cout<<"Complement";
           flag=true;
       }
        else
            flag=false;
   }
    return flag;
}

//helping functions

void Graph::DFSrecursive (int n, bool visited[])
{
    visited[n] = true;
    list<int>::iterator i;
    for (i = adj[n].begin(); i != adj[n].end(); ++i)
        if (!visited[*i])
            DFSrecursive(*i, visited);
}

Graph Graph::ReverseGraph()
{
    Graph g(num_of_vertices);
    for (int v = 0; v < num_of_vertices; v++)
    {
        list<int>::iterator i;
        for(i = adj[v].begin(); i != adj[v].end(); ++i)
        {
            g.adj[*i].push_back(v);
        }
    }
    return g;
}
4

1 回答 1

2

由于is_complement是类的成员函数Graph,因此您需要使用 object 中的点运算符调用它g

cout<< g.is_complement(g,g1) << "\n";应该管用。

于 2020-05-18T16:01:11.253 回答