数据结构与算法题目集(中文) - 7-25 朋友圈(25 分)

题目链接:点击打开链接

题目大意:略。

解题思路:入门级并查集。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

int pre[30000+10], vis[30000+10];

void init()
{
    for(int i=1;i<30000+10;i++) pre[i]=i;
    mem(vis,0);
}

int find(int x)
{
    int r=x;
    while( pre[r]!= r )
         r=pre[r];

    int i=x, j;
    while( i != r )
    {
         j = pre[i];
         pre[i] = r ;
         i = j;
    }
    return r ;
}

void join(int x,int y)
{
    int fx=find(x),fy=find(y);
    pre[fy]=fx;
}

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        int tn,a[n+10];
        while(m--)
        {
            scanf("%d",&tn);
            for(int i=0;i<tn;i++)
            {
                scanf("%d",&a[i]);
                if(i) join(a[i-1],a[i]); // 小技巧
            }
        }

        int rs=0;
        for(int i=1;i<=n;i++)
        {
//            printf("%d == %d\n",i,find(i)); // 注意这里是 find(i),而不是 pre[i]
            int rt=find(i);
            vis[rt]++;
            rs=max(rs,vis[rt]);
        }

        printf("%d\n",rs);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/81130716