看视频学并查集和二叉树(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.代码实现二叉树