题目:要举办一个生日会,为了避免气氛尴尬要让认识的人坐在一起,计算最少几张桌子。
规定朋友的朋友都是朋友,即可以坐在同一张桌子上面。
首先输入几个案例,然后输入总人数和共几对朋友关系,最后输入那两个人认识。
测试用例:
Sample Input
2 5 3 1 2 2 3 4 5 5 1 2 5
Sample Output
2 4关于此题,即找关系,只要有关系就可以坐在一张桌子上。解题思路:1.认为每个人之间都没有关系,即每个人都是自己的首领2.然后建立彼此之间的关系,找出首领3.有多少个首领#include<stdio.h> int a[1000];//定义全局变量 void link(int x,int y)//建立两人的联系 { int xb=find(x);//找出X的首领 int yb=find(y);//找出Y的首领 if(xb!=yb)//如果两人首领不一样,就让其中一个人的首领服从于另一个人的首领 a[xb]=yb; } int find(int x)//找出自己的首领 { if(a[x]!=x)//如果不是自己就递归查找 return find(a[x]); else return x; } main() { int x,y,k,n,m,s,q,i,j; scanf("%d",&k); for(i=0;i<k;i++)//K个测试用例 { s=0;//桌子张数开始为0 scanf("%d%d",&n,&m);//输入几个人,几对关系 for(j=0;j<=n;j++)//每个人都是自己的首领,即每个人都没关系 a[j]=j; for(q=0;q<m;q++) { scanf("%d%d",&x,&y); link(x,y);//建立关系
} for(j=1;j<=n;j++) { if(a[j]==j)//只要是首领,即跟很多人都是朋友即需要一张桌子 s++; } printf("%d\n\n",s); } }