给出 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; }