添加链接描述
刚开始做题前看过的文章。
那下面一个例题来讲查并集。
现在有一个舞会,在舞会上,大家会相互介绍自己的朋友。
即: 如果a认识b,b认识c。那么在舞会上,a就会通过b认识到c。
现在,给出m个关系
每个关系描述:
a b
表示 编号为a和编号为b的人是朋友关系。
很明显的查并集题,查并集主要就是让两个有关系的人建立一个共同的领袖2,如果领袖2还有领袖1就让他们属于共同的领袖1,最后领袖1的数量就是朋友圈的个数。
#include<stdio.h>
int a[1000000]={0},sum,n,m,k,sun=0;
void start()//让数组初始化的函数
{
int i;
for(i=1;i<=n;i++)
a[i]=i;
}
int chang(int v)
{
if(a[v]==v)//如果数组下标等于该值,则代表该数为领袖
return v;
else
{
a[v]=chang(a[v]);//递归,直至找到该数的领袖
return a[v];
}
}
void ban(int p,int q)
{
int t1,t2;
t1=chang(p);//分别找到这俩个数的领袖
t2=chang(q);
if(t1!=t2)//如果俩人领袖不一样,靠左原则,让左边的人当团队的新领袖
{
a[t2]=t1;
}
}
int main()
{
int i,x,y;
scanf("%d%d",&n,&m);
start();
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
ban(x,y);
}
for(i=1;i<=n;i++)
if(a[i]==i)//若下标等于该数值,则确定为一个领袖
sum++;
printf("%d\n",sum);
return 0;
}
本周总结:
这几天cf比赛打得还比较勤快,但是题目没咋补明白。有点不太能兼顾主课的学习,大物和电子课有点落后,不过过几天五一放假,可以补补课。没啥好说的题还是要刷的。