• pku 1611 The Suspects


    题目:http://poj.org/problem?id=1611

    求包括0号的集合的集合元素个数。

    方法一:

    用一个num数组计算第i个集合中的元素的个数

    View Code
    #include<stdio.h>
    #define maxn 30001
    int num[maxn],father[maxn];
    int flag;
    int find(int x)
    {
    int r=x;
    if(father[r]!=r)
    r
    =find(father[r]);
    int j,i=x;
    while(r!=i)
    {
    j
    =father[i];
    father[i]
    =r;
    i
    =j;
    }
    return r;
    }

    void merge(int x,int y)
    {
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
    return;
    if(fx>fy)
    {
    father[fy]
    =fx;
    num[fx]
    +=num[fy];
    if(fy==flag)
    flag
    =fx;
    }
    else
    {
    father[fx]
    =fy;
    num[fy]
    +=num[fx];
    if(fx==flag)
    flag
    =fy;
    }
    }

    int main()
    {
    int n,m,k,i,x,y;
    while(scanf("%d%d",&n,&m)!=EOF&&n+m!=0)
    {
    flag
    =0;
    for(i=0;i<=n;i++)
    {
    father[i]
    =i; //表示i节点的父亲节点
    num[i]=1; //表示点i所在集合内有多少个元素
    }
    while(m--)
    {
    scanf(
    "%d",&k);
    for(i=0;i<k;i++)
    {
    if(i==0)
    scanf(
    "%d",&x);
    else
    scanf(
    "%d",&y);
    if(i==0)
    continue;
    merge(x,y);
    }
    }
    printf(
    "%d\n",num[flag]);
    }
    return 0;
    }

    方法二:

    通过并查集合并集合后去裸搜含0的集合的元素个数

    View Code
    #include<stdio.h>
    int set[30001],a[30001];
    int find(int x)
    {
    int r=x;
    while(r!=set[r])
    {
    r
    =set[r];
    }
    int j,i=x;
    while(i!=r)
    {
    j
    =set[i];
    set[i]=r;
    i
    =j;
    }
    return r;
    }

    void merge(int x,int y)
    {
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    set[fx]=fy;
    }

    int main()
    {
    int n,m,i,k,num,x;
    while(scanf("%d%d",&n,&m)!=EOF&&n+m!=0)
    {
    for(i=0;i<=n;i++)
    {
    set[i]=i;
    }
    while(m--)
    {
    scanf(
    "%d",&k);
    for(i=0;i<k;i++)
    {
    scanf(
    "%d",&a[i]);
    }
    if(k==1)
    continue;
    for(i=1;i<k;i++)
    {
    merge(a[i
    -1],a[i]);
    }
    }
    x
    =find(0);
    num
    =1;
    for(i=1;i<=n;i++)
    {
    if(x==find(i))
    num
    ++;
    }
    printf(
    "%d\n",num);
    }
    return 0;
    }

      

  • 相关阅读:
    predis操作
    mysql 笔记(转载)
    mysql 汉字根据首字母排序
    sql 优化
    update多条不同数据
    解决network is unreachable问题
    开启服务器端口
    数据库开启远程访问
    激活2021.2.1idea
    python向excel追加数据
  • 原文地址:https://www.cnblogs.com/lujiacheng/p/2113951.html
Copyright © 2020-2023  润新知