标题:给出 n 个人 m 个关系,有关系的人可以同桌,计算需要多少张桌子!
只看楼主
hackrol
Rank: 4
来 自:世界和平组织
等 级:业余侠客
帖 子:62
专家分:267
注 册:2014-9-6
结帖率:0
 问题点数:0 回复次数:2 
给出 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;
}
搜索更多相关主题的帖子: 桌子 生日 
2014-10-23 23:19
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:0 
是求最多要多少张桌子还是最少要多少张桌子啊!关系对象又不确定,值在一个范围吧

Maybe
2014-10-24 17:27
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 2 楼 邓士林
需要的桌子的数量是确定的。两个人之间的关系是确定的,要么认识要么不认识。直接认识或间接认识就必然坐在一起,否则就绝不在一起。不存在可以在一起也可以不在一起的情况。

以每个人作为结点,以人与人之间的关系(认识)为连线,可以形成一张图。题目要求的结果即是统计这张图中连通区域的数量。

重剑无锋,大巧不工
2014-10-24 20:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-437619-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045023 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved