第九周 周结(图论算法——查并集)

添加链接描述
刚开始做题前看过的文章。

那下面一个例题来讲查并集。

现在有一个舞会,在舞会上,大家会相互介绍自己的朋友。
即: 如果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比赛打得还比较勤快,但是题目没咋补明白。有点不太能兼顾主课的学习,大物和电子课有点落后,不过过几天五一放假,可以补补课。没啥好说的题还是要刷的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值