zoukankan      html  css  js  c++  java
  • codeforces-C. News Distribution-2019.5.15

    模板题:并查集

    题意:给你n个用户和m个组,让你求出如果第i个人传播消息,会有几个人知道。http://codeforces.com/contest/1167/problem/C

    思路:简单的并查集

    #include <cstdio>
    #include<bits/stdc++.h>
    const int maxnn = 3000000;
    using namespace std;
    typedef long long ll;
    int pre[600000];
    int rank1[600000];
    int _find(int x)
    {
        int a=x;
        while(x!=pre[x])
        {
            x=pre[x];
            rank1[a]++;
        }
        return x;
    }
    int _find1(int x)
    {
    
        int a=x;
        while(x!=pre[x])
        {
            x=pre[x];
        }
        return x;
    
    }
    int main()
    {
        int n,m;
        for(int i=0;i<600000;i++){pre[i]=i;rank1[i]=1;}
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            int t;
            scanf("%d",&t);
            if(t==0)continue;
            int k,kk;
            scanf("%d",&k);
            for(int j=0;j<t-1;j++)
            {
                scanf("%d",&kk);
                int a=_find(k);
                int b=_find(kk);
                if(a!=b)
                {
                    if(rank1[a]>rank1[b])
                    {
                        pre[b]=a;
                        rank1[a]+=rank1[b];
                    }
    
                    else
                    {
                        pre[a]=b;
                        rank1[b]+=rank1[a];
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            pre[i]=_find1(pre[i]);
            rank1[i]=rank1[_find(pre[i])];
        }
        for(int i=1;i<=n;i++)
        {
            if(i==1)printf("%d",rank1[i]);
            else  printf(" %d",rank1[i]);
        }
        return 0;
    }
  • 相关阅读:
    第四章学习小结
    第三章学习小结
    第二章学习小结
    DS第五章学习小结
    DS第四章学习小结
    DS第三章小结
    第五章小结
    第四章小结
    第三章小结
    第二章小结
  • 原文地址:https://www.cnblogs.com/kayiko/p/10874193.html
Copyright © 2011-2022 走看看