zoukankan      html  css  js  c++  java
  • 冗余关系_并查集

    冗余关系

    蒜头最近在沉迷小说,尤其是人物关系复杂的言情小说。它看到的人物关系描述得很的麻烦的时候觉得非常蒜疼,尤其是任务关系里有冗余的时候。什么是冗余关系呢?

    这篇小说里有n句描述人物关系的句子,描述了n个人的关系。

    每条句子的定义是这样的:

        X<->Y    它的意思是:X认识Y,Y也认识X

    我们认为小说中的人物关系是具有传递性的,假如A认识B,B认识C,则A也认识C。

    冗余关系的定义:就是即使没有这条人物关系,原来的人物之间的所有关系也照样成立。

    比如:

    小说中已经提到了A认识B,B也认识C。在此之后再讲A认识C就是一个冗余的关系。

    小蒜头想求出一共有多少条冗余关系,你能帮帮它吗?

    输入格式:

        第一行两个整数,表示句子数量n(1<=n<=1000),表示人数m(1<=m<=1000)。

        接下来n行,每行两个数,表示一组人物关系。

    输出格式:

        一个整数,表示冗余关系的数目。

    样例输入

    3 3
    1 2
    1 3
    2 3
    

    样例输出

    1
    解题思路:并查集可以用用数组来表示图,每一个连通子图都选出一个队长,然后构造成树状的。。。。
      此题要输出冗余关系,如果有两个数的队长是同一个,说明此时的关系是冗余关系,cou++。
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int s[1005];
    int cou=0;
    
    int find_set(int a){
        if(s[a]!=a) s[a]=find_set(s[a]);
        return s[a];
    }
    
    void union_set(int a,int b){
        int fa=find_set(a);
        int fb=find_set(b);
        if(fa!=fb){
            s[fa]=fb;
        }else{
            cou++;
        }
    }
    
    int main()
    {
        int n,m;
        int x,y;
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            s[i]=i;
        }
        for(int i=0;i<n;i++){
            scanf("%d %d",&x,&y);
            union_set(x,y);
        }
        printf("%d
    ",cou);
        return 0;
    }

     新模板:

    int par[MAX_N];
    int depth[MAX_N];//记录每个节点下面到位深度
    
    void init(int n)//初始化
        {for(i,0,n) {par[i]=i;depth[i]=1;}}
    int findf(int t)//寻找根节点
        { return t==par[t] ? t:par[t]=findf(par[t]);}
    bool same(int x,int y)//是否在同一组内
        {return findf(x)==findf(y);}
    void unite(int t1,int t2){//成为一组
        int f1=findf(t1);
        int f2=findf(t2);
        if(f1==f2){
            return ;
        }
        if(depth[f1]<depth[f2]){
            par[f1]=f2;
        }else{
            par[f2]=f1;
            if(depth[f1]==depth[f2]){
                depth[f1]++;//记录深度
            }
        }
    }
  • 相关阅读:
    网站代码优化总结
    移动端 H5 页面注意事项
    js基础知识点收集
    2017-3-26 webpack入门(一)
    gulp教程
    less的使用
    微信小程序接口封装
    div上下左右居中几种方式
    前端知识点-面试
    call和apply
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5838900.html
Copyright © 2011-2022 走看看