给出 n 个人 m 个关系,有关系的人可以同桌,计算需要多少张桌子!
程序代码:/*
一个生日宴会 现在有n个人参加 他们编号从1到n 他们之间有的互相认识 有的互相不认识
能够认识的人坐在一张桌子上 比如:1跟2认识并且2跟3认识 所以1、2、3要坐在一张桌子
上(虽然1跟3不认识) 给你m条互相认识的关系 问需要多少张桌子
Sample Input
5 3
1 2
2 3
4 5
Sample Output
2
Sample Input
5 1
2 4
Sample Output
4
*/
//练习使用动态一维和二维数组
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main(void)
{
int n,m,(*p)[2],i,flag=-1,count=0,*q; //flag用于标记是否已经有座
printf("请输入n,m的值:\n");
scanf("%d%d",&n,&m);
while(n<=0||m<=0) //判断n,m的合法性
{
printf("输入错误,请重新输入n,m的值\n");
scanf("%d%d",&n,&m);
}
q=(int *)malloc(n*sizeof(int)); //创建动态数组并用1到n的数初始化,表示n个人;
for(i=0;i<n;i++)q[i]=i+1;
p=(int(*)[2])malloc(m*2*sizeof(int)); //创建一个动态二维数组存放关系组,第一次用,将就吧
for(i=0;i<m;i++) //录入关系数据
{
printf("请输入第%d组关系:\n",i+1);
scanf("%d%d",&p[i][0],&p[i][1]);
while((p[i][0]<=0||p[i][0]>n)||(p[i][1]<=0||p[i][1]>n)) //判断关系数据合法性
{
printf("请输入1-%d的数:",n);
scanf("%d%d",&p[i][0],&p[i][1]);
}
}
for(i=0;i<m;i++)
{
if(q[(p[i][0])-1]>0&&q[(p[i][1])-1]>0) //判断p[i][0]与p[i][1] 在q数组里所对应的值是否全大于零
count++;
q[(p[i][0])-1]=q[(p[i][1])-1]=flag; //不管是否全大于零,都将它们变成flag.标记已经有桌子.
}
for(i=0;i<n;i++) //计算还没有桌子的人数,一人一张桌子
if(q[i]>0)count++;
printf("一共需要%d张桌子!\n",count);
return 0;
}









