2022/1/18学习总结

看视频学并查集和二叉树(3h)

回顾了一下昨天学的二叉树,把四种遍历顺序过了一下,二叉树的概念也过了一下,代码实现还是搁置了,不知道怎么建立一个树,很难受。

然后学了并查集。并查集相对二叉树就要简单多了,概念的难度这俩差不多,但并查集的代码实现要比二叉树简单多了,看了几遍后就敲出来了。

听蛋子哥将二叉树和并查集(2h)

蛋子哥讲完二叉树的四种遍历顺序后,我如沐春风,醍醐灌顶。原来我之前理解的还比较模糊,没有完全搞明白这几种遍历。但关于建立二叉树,我还是不太清楚如何操作,还得学。并查集已经懂了,跟着蛋子哥复习了一遍。

刷题(4h)

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(int x);
void merge(int i,int j);
int fa[10001];
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int i,x,y,z;
    for(i=1;i<=n;i++)
        fa[i]=i;
    for(i=0;i<m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        if(x==1)
        {
            merge(y,z);
        }
        if(x==2)
        {
            if(find(y)==find(z))
                printf("Y\n");
            else printf("N\n");
        }

    }
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else
        return find(fa[x]);
}

void merge(int i,int j)
{
    fa[find(i)]=find(j);
}

优化版本

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(int x);
void merge(int i,int j);
int fa[10001];
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int i,x,y,z;
    for(i=1;i<=n;i++)
        fa[i]=i;
    for(i=0;i<m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        if(x==1)
        {
            merge(y,z);
        }
        if(x==2)
        {
            if(find(y)==find(z))
                printf("Y\n");
            else printf("N\n");
        }

    }
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else
        {
            fa[x]=find(fa[x]);
            return fa[x];
        }
}

 void merge(int i,int j)
{
    fa[find(i)]=find(j);
}

二度改进

 


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(int x);
void merge(int i,int j);
int fa[10001],rank[10001];
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int i,x,y,z;
    for(i=1;i<=n;i++){
        fa[i]=i;
        rank[i]=1;
    }
    for(i=0;i<m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        if(x==1)
        {
            merge(y,z);
        }
        if(x==2)
        {
            if(find(y)==find(z))
                printf("Y\n");
            else printf("N\n");
        }

    }
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else
        {
            fa[x]=find(fa[x]);
            return fa[x];
        }
}

 void merge(int i,int j)
{
    int x=find(i),y=find(j);
    if(rank[x]<=rank[y])
        fa[x]=y;
    else fa[y]=x;
    if(rank[x]==rank[y]&&x!=y)
        rank[y]++;
}

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(int x);
void merge(int i,int j);
int fa[5001];
int main()
{
    int n,m,p;
    scanf("%d %d %d",&n,&m,&p);
    int i,x,y;
    for(i=1;i<=n;i++)
        fa[i]=i;
    for(i=0;i<m;i++)
    {
        scanf("%d %d",&x,&y);
        merge(x,y);
    }
    for(i=0;i<p;i++)
    {
        scanf("%d %d",&x,&y);
        if(find(x)==find(y))
            printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else
        {
            fa[x]=find(fa[x]);
            return fa[x];
        }
}

 void merge(int i,int j)
{
    fa[find(i)]=find(j);
}

 

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int find(int x);
void merge(int i,int j);
int findf(int x);
void mergef(int i,int j);
int fa[10001];
int fafa[10001];
int main()
{
    int n,m,p,q;
    scanf("%d %d %d %d",&n,&m,&p,&q);
    int i,x,y;
    for(i=1;i<=n;i++){
        fa[i]=i;}

        for(i=1;i<=m;i++){
            fafa[i]=i;}

    for(i=0;i<p+q;i++)
    {
        scanf("%d %d",&x,&y);
        if(x>0)merge(x,y);
        else mergef(-x,-y);
    }
    int girl=0,boy=0;
    for(i=1;i<=n;i++)
    {
        if(find(i)==find(1))
            boy++;
    }
    for(i=1;i<=m;i++)
    {
        if(findf(i)==findf(1))
            girl++;
    }
    if(boy>girl)printf("%d",girl);
    else printf("%d",boy);
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else
        {
            fa[x]=find(fa[x]);
            return fa[x];
        }
}

 void merge(int i,int j)
{

    fa[find(i)]=find(j);
}

void mergef(int i,int j)
{
    fafa[findf(i)]=findf(j);
}

int findf(int x)
{
    if(fafa[x]==x)
        return x;
    else
        {
            fafa[x]=findf(fafa[x]);
            return fafa[x];
        }
}

总计8.5h

1.刷完并查集的题

2.代码实现二叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值