无向图是否有环(转载)

#include 
#include 
#include 
 
using namespace std;
 
vector Parent;
 
void initSet(){
 
    for(int i = 0; i < Parent.size(); i++)
        Parent[i] = -1;
 
}
 
int findSet(int x){
 
    if(Parent[x] == -1){
        return x; // x is root
    }
    return findSet(Parent[x]);
 
}
 
void UnionSet(int x, int y){
 
    int xp = findSet(x);
    int yp = findSet(y);
    Parent[xp] = yp;
 
}
 
int main(){
 
    int N, E;
    cin >> N >> E;
    vector > edges(N);
    Parent.resize(N);
    int v1,v2;
    for(int i = 0; i < E; i++){
        cin >> v1 >> v2;
        edges[v1].push_back(v2);
        //edges[v2].push_back(v1);
    }
    // 测试是否有环
    initSet();
    for(int v = 0; v < edges.size(); v++){
        for(int i = 0; i < edges[v].size(); i++){
            int w = edges[v][i];
            int xp = findSet(v);
            int yp = findSet(w);
            if(xp == yp){
                cout << "未合并前同根,说明有环。" << endl;
                return 0;
            }
            UnionSet(v,w);
        }
    }
    cout << "无环" << endl;
    return 0;
 
}

 

你可能感兴趣的:(C++,DFS)