zoukankan      html  css  js  c++  java
  • 【POJ】[1611]The Suspects

    这里写图片描述
    输入输出

    上次个人赛出了这一题
    不过当时用的搜索的思维来写的

    大概就是遇见一个人感染
    则寻找所有社团中包含这个人的社团
    并分别对每一个成员递归

    #include<stdio.h>
    #include<string.h>
    int n,z,cnt;
    int a[500][1000];
    int b[30000];
    void s(int m) {
        if(!b[m]) {
            cnt++;
            b[m]=1;
        } else
            return ;
        for(int i=0; i<z; i++) {
            for(int j=1; j<=a[i][0]; j++) {
                if(a[i][j]==m) {
                    for(int k=1; k<=a[i][0]; k++) {
                        if(a[i][k]!=m)
                            s(a[i][k]);
                    }
                    break;
                }
            }
        }
    }
    int main() {
        while(scanf("%d %d",&n,&z),n!=0||z!=0) {
            memset(b,0,sizeof(b));
            memset(a,0,sizeof(a));
            for(int i=0; i<z; i++) {
                scanf("%d",&a[i][0]);
                for(int j=1; j<=a[i][0]; j++) {
                    scanf("%d",&a[i][j]);
                }
            }
            cnt=0;
            s(0);
            printf("%d
    ",cnt);
        }
        return 0;
    }

    不过这一题用并查集的思想还是更为简便一些

    也就是直接根据社团关系来合并集合
    然后最后查找有几个和 0 号在同一个集合

    #include<stdio.h>
    int par[30200];
    int rank[30200];
    int find(int m) {
        if(m==par[m])
            return m;
        else
            return par[m]=find(par[m]);
    }
    void unite(int x,int y) {
        x=find(x);
        y=find(y);
        if(x==y)
            return;
        if(rank[x]<rank[y])
            par[x]=y;
        else {
            par[y]=x;
            if(rank[x]==rank[y])
                rank[x]++;
        }
    }
    int main() {
        int n,m;
        while(scanf("%d %d",&n,&m),n||m) {
            for(int i=0; i<n; i++) {
                par[i]=i;
                rank[i]=0;
            }
            for(int i=0; i<m; i++) {
                int k;
                scanf("%d",&k);
                int t;
                scanf("%d",&t);
                k--;
                while(k--) {
                    int p;
                    scanf("%d",&p);
                    unite(t,p);
                    t=p;
                }
            }
            int cnt=0;
            for(int i=0; i<n; i++) {
                if(find(i)==find(0))
                    cnt++;
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    

    题目地址:【POJ】[1611]The Suspects

  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569805.html
Copyright © 2011-2022 走看看