zoukankan      html  css  js  c++  java
  • 并查集检测无向图有无环

    无向图,检测有无环,可以用并查集

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e4;
    vector<pair<int,int> >a(maxn);
    int parent[maxn];
    int rank_[maxn];
    int n,m,x,y,k,v1,v2,op;
    void init(){
        for(int i=0;i<maxn;i++)rank_[i]=0;
        for(int i=0;i<maxn;i++)parent[i]=i;
    }
    int find_(int x){
        int x_root=x;
        while(parent[x_root]!=x_root){
            x_root=parent[x_root];
        }
        return x_root;
    }
    int  union_point(int x,int y){
        int x_root=find_(x);
        int y_root=find_(y);
        if(x_root!=y_root){
            if(rank_[x_root]>rank_[y_root]){///以高度高的树作为根节点,高度不变
                parent[y_root]=x_root;
            }
            else if(rank_[y_root]>rank_[x_root]){
                parent[x_root]=y_root;
            }
            else {///只有在高度相等时,rank++
                rank_[x_root]++;
                parent[x_root]=y_root;
            }
            return 1;
        }
        return 0;///同一个祖先,证明有环
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>v1>>v2;
            a[i]=make_pair(v1,v2);
        }
        init();
        for(int i=0;i<n;i++){
            if (union_point(a[i].first,a[i].second)==0){
                cout<<"cycle detected!"<<endl;
                return 0;
            }
        }
        cout<<"no cycle found"<<endl;
        return 0;
    }
    /*
    6
    0 1
    1 2
    1 3
    3 4
    2 5
    2 3
    */
  • 相关阅读:
    day01的那些事
    Activity活动
    开始认真学习Android了
    《知其所以然》读书笔记
    网络编程——完成端口
    开发服务器端——工程配置
    完善自己的学习方法
    WSAAsyncSelect模型
    双缓冲绘图
    ListControl常用操作汇总
  • 原文地址:https://www.cnblogs.com/mohari/p/12933799.html
Copyright © 2011-2022 走看看