обнаружение цикла в неориентированном графе с использованием массива dfs и height - PullRequest
0 голосов
/ 14 апреля 2019

Моя задача - завершить функцию isCyclic () в следующей программе.Я могу справиться с этой задачей с помощью посещенного массива и передачи родителя в функцию dfs (), но я пытаюсь найти другое решение, поэтому я использую массив высот, чтобы отслеживать расстояние между узлами в дереве DFS для определения родителей и цикла.этот массив высот начальный с нуля.Если расстояние между двумя узлами равно одному, эти два узла являются родительскими и дочерними.Но я не могу понять, почему мое решение не работает.может кто-нибудь сказать мне, почему вывод этого кода не является правильным?спасибо за вашу помощь.

Пример графика и значения высоты узлов:

   /*
    .1
   / \
  .2  .2
     / \
    .3  .3
 */
#include<bits/stdc++.h>
using namespace std;
class Graph
{
    int V;
    list<int> *adj;
public :
    Graph(int V);
    void addEdge(int v,int w);
    bool isCyclic();
};
vector<int> g[100001];
Graph::Graph(int V)
{
    this->V = V;
    adj = new list<int>[V];
}
void Graph::addEdge(int v,int w)
{
    adj[v].push_back(w);
    adj[w].push_back(v);
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int _size,N;
        cin>>_size>>N;
        Graph *g = new Graph(_size);
        for(int i=0;i<N;i++)
        {
            int u,v;
            cin>>u>>v;
            g->addEdge(u,v);
        }
        cout<<g->isCyclic()<<endl;
    }
}


/*Please note that it's Function problem i.e.
you need to write your solution in the form of Function(s) only.
Driver Code to call/invoke your function is mentioned above.*/

/*The structure of the class is as follows 
which contains an integer V denoting the no 
of vertices and a list of adjacency vertices.
class Graph
{
    int V;
    list<int> *adj;
public :
    Graph(int V);
    void addEdge(int v,int w);
    bool isCyclic();
};*/
/*You are required to complete this method*/

bool dfs(int v, int hi, list<int> *adj, int *h) {
    h[v] = hi;

    list<int>::iterator it;
    for(it = adj[v].begin(); it != adj[v].end(); it++) {
        int u = *it;

        //cycle detect
        if (h[u]>0 && hi - h[u] > 1)
            return true;

        if (h[u]==0 && dfs(u, hi+1, adj, h))
            return true;
    }

    return false;
}

/*You are required to complete this method*/
bool Graph :: isCyclic()
{
//Your code here
    int h[V];
    for(int i = 0; i < V; i++) h[i] = 0;

    for(int i = 0; i< V; i++) 
        if ( h[i] == 0 && dfs(i, 1, adj, h) ) return true;
    return false;
}

Ввод, который делает мой ответ неверным:

Ввод: 85 59 0 3432 54 6 16 45 44 82 52 57 15 20 60 52 44 75 77 48 18 53 75 14 40 39 46 24 26 32 0 39 74 34 29 43 41 45 45 0 42 54 14 58 75 31 67 34 63 16 39 81 6929 52 67 26 14 6 52 3 48 49 77 83 78 78 81 38 38 38 38 8 53 53 40 84 77 31 63 9 70 16 78 57 69 60 83 23 7 7 43 72 56 27 6 70 23 2 24 61 4074 71 50 29 28 42 60 48 51 2 64 2 59 48 19 57

Правильный вывод: 1

И вывод вашего кода: 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...