free pascal 帮忙啊 家庭问题 急急急!!!会的帮个忙吧!!用宽搜 20

有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。问题:当n,k和k个关系给出之后,求出其中共有多... 有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。
问题:当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人?
例如:
n=6,k=3,三个关系为(1,2),(1,3),(4,5)
此时,6个人组成三个家庭,即:{1,2,3}为一个家庭,{4,5}为一个家庭,{6}单独为一个家庭,第一个家庭的人数为最多。
输入:
文件的第一行为n,k二个整数(1≤n≤100)(用空格分隔)
接下来的k行,每行二个整数(用空格分隔)表示关系
输出:
二个整数(分别表示家庭个数和最大家庭人数)
样例输入:
6 3
1 2
1 3
4 5
样例输出:
3 3

宽搜 不能用穷举 谢谢!! 除了程序,最好还有解释,谢谢
展开
 我来答
蚊子死神
2012-08-11 · 超过34用户采纳过TA的回答
知道答主
回答量:95
采纳率:0%
帮助的人:83.8万
展开全部
唔 宽搜啊 。。数据范围很小。。深搜。。宽搜都可以。。。 这个是连通分量的题。。。是图论。。。
你建一个矩阵。。然后从一个没有使用过的点开始搜。。。把与他所有有关系的点 都标记下来。。
然后记录下节点数量。如果比最大的家庭人数大,就更新最大值。。增加一个家庭个数。。然后再找一个没有使用过的点。。继续如上的步骤。。。
最后就输出家庭个数。。和最大人数即可。。。
这种题就是要求遍历一次图。。。仔细想下会发现很简单的
ge372593801
2012-08-10 · 超过13用户采纳过TA的回答
知道答主
回答量:74
采纳率:0%
帮助的人:39.3万
展开全部
这题是贪心啊。。。我晕。宽搜什么啊。

这个问题有一个专门的图论名称,特别简单,忘了叫什么名字了
大体思路给你说一下。
read(n,k); ‘读入
For i:=1 to n do
begin
f[i]:=i; ‘先把自己作为父亲;
s[i]:=1; '记录本家庭儿子的数量;
然后继续读入
For i:=1 to k do
begin
read(t1,t2);
f[t2]:=getfather(t1);
s[t1]:=s[t2]+s[t1];
end;
getfather的函数我写在后面了
funtion getfather(a):
beign
if f[a]<>a then
getfather:=getfather(f[a]);
else getfather:=f[a];
end;
看不清思路再再找我,问问老师这叫什么算法。我忘了,这不是宽搜题。数据量大了受不了。
更多追问追答
追问
不是吗?但是我们老师说一定要用宽搜做啊,而且这题好像要用搜索的,你再看看题目呢
追答
我做过原题的,不是搜索啦。。。有一道著名的题目《银河英雄传说》吧

我去搜过了,这种叫做 并查集 。比较简单的算法了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
188439102
2016-07-29
知道答主
回答量:5
采纳率:0%
帮助的人:4733
展开全部
定义一个二维布尔型数组a,a[i,j]=true表示i与j为一家人,先找出所以有单独为一家的(即与任何人没有关系),将答案赋值,再用队列实现查找,每找到一个就讲将答案加一,然后宽搜查找所有相关的,赋值FALSE,顺便记录家庭成员个数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冲出马家庄
2012-08-09 · TA获得超过914个赞
知道小有建树答主
回答量:361
采纳率:100%
帮助的人:430万
展开全部
额,又看到你这个题目了。我刚才的回答你看到了么?有问题给我说哈
追问
追答
专门下了个free pascal,现在都正常了,可以正确输出答案
program FR1(input,output);
var
n,k,fn,mf:integer;
i,a,b:integer;
rel:array[1..100,1..100] of boolean;
mark:array[1..100] of boolean;
que:array[1..100] of integer;
head,tail:integer;
procedure init;
begin
fillchar(rel,sizeof(rel),false);
fillchar(mark,sizeof(mark),false);
fn:=0;
mf:=0;
end;
procedure resetQ;
begin
head:=1;
tail:=1;
fillchar(que,sizeof(que),0);
end;
procedure pushQ(n:integer);
begin
que[tail]:=n;
tail:=tail+1;
end;
function popQ:integer;
begin
popQ:=que[head];
head:=head+1;
end;
procedure bfs(index:integer);
var
i,t,sum:integer;
begin
resetQ;
pushQ(index);
sum:=1;
fn:=fn+1;
repeat
t:=popQ;
for i:=1 to n do begin
if (rel[t,i]=true) and (mark[i]=false)
then begin
mark[i]:=true;
sum:=sum+1;
pushQ(i);
end;
end;
until head=tail;
if sum>mf then mf:=sum;
end;
begin
readln(n,k);
init;
for i:=1 to k do begin
readln(a,b);
rel[a,b]:=true;
rel[b,a]:=true;
end;
for i:=1 to n do begin
if mark[i]=false
then begin
mark[i]:=true;
bfs(i);
end;
end;
writeln(fn,' ',mf);
end.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式