如何在无向图中检查循环的存在?

时间:2017-02-28 04:10:03

标签: data-structures graph graph-algorithm depth-first-search undirected-graph

#include <bits/stdc++.h>
        using namespace std;
    int n,m;
    vector<int> adj[51];
    int visited[51];
    bool flag;
    void dfs(int i,int parent){
        vector<int>::iterator it;
        for(it = adj[i].begin();it!=adj[i].end();it++){
            if(!visited[*it]){
                visited[*it]=1;
                dfs(*it,i); // passing parent element
            }
            if(visited[*it] && (*it !=parent )){
                flag=true; return;
            }
        }
    }
    int main(){
        int a,b;
        cin>>n>>m;
        for(int i=0;i<m;i++){  // graph ready.
            cin>>a>>b;
            if(a==b){
                cout<<"YES"; return 0;
            }
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        for(int i=1;i<=n;i++){
            std::vector<int>::iterator it;
            for(it=adj[i].begin();it!=adj[i].end();it++){
                if(!visited[*it]){
                    visited[*it]=1;
                    dfs(*it,-1);
                }
            }
        }
        if(flag){
            cout<<"YES"<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }

任何人都可以查看我的代码并告诉我我在这里缺少哪个测试用例。 hackerearth只得到60/100。我在这里使用父变量来跟踪被认为是循环的单个边缘。

1 个答案:

答案 0 :(得分:0)

您输出错误,因为在adjacency list 中,每个边都列出两次。

所以说我们的图表包含3 vertices2 edges

1------2------3
显然,没有循环。但您的代码也会为此输入返回 YES 。原因是一旦特定顶点i由于其父j而被访问,下次调用dfs i时,顶点j将会出现要访问,因此,输出,这是错误的。

<强> FIX

每当我们访问已经访问过的顶点i时,我们都不会立即声明我们已经找到了一个循环,我们必须确保顶点i不是顶点的父节点我们打电话给dfs,只有这样你才能得到正确答案。

一旦你理解了出错的地方,代码就会更容易编写。