作业帮 > 综合 > 作业

关于‘pascal.’的一道题的程序解释

来源:学生作业帮 编辑:搜搜做题作业网作业帮 分类:综合作业 时间:2024/05/01 11:42:07
关于‘pascal.’的一道题的程序解释
6.找树根和孩子(find.pas)
Description
给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子.
Input
第一行:n(结点个数),m(边数).
以下m行;每行两个结点x和y,表示y是x的孩子.
Output
第一行:树根:root.
第二行:孩子最多的结点max.
第三行:max的孩子.
var
a,b,c,d:array[0..100] of integer;
n,m,max,i,j:integer;
t,x:integer;
begin
assign(input,'find.in');reset(input);
assign(output,'find.out');rewrite(output);
readln(n,m);
for i:=1 to m do
begin
readln(a[i],b[i]);
d[b[i]]:=1;
end;
for i:=1 to n do if d[i]=0 then begin writeln(i); break end;
for i:=1 to n do
inc(c[a[i]]);
max:=c[1];
for i:=1 to n do
if c[i]>max then max:=c[i];
for i:=1 to n do
if c[i]=max then begin writeln(i); max:=i; break; end;
for i:=1 to n do
if a[i]=max then write(b[i],' ');
close(input);
close(output);
end.
看不懂.求高手解释.详细点...谢谢啦.~~~
关于‘pascal.’的一道题的程序解释
回答你的问题纯粹是因为这代码太烂了,还出来教人的话纯属误人子弟.
首先,c数组没有赋初值0,程序不会得到正确结果
第二,计算孩子节点数和读取节点关系对是可在一个循环内的.
第三,max变量的意义在前后代码中发生了变化,这个习惯不好.
第四,源代码n,m不分,犯了很多错误.
代码解释如下:(已修正)
var
{a、b记录树节点关系对,a记录父节点b记录子节点,c是节点的孩子数,d是记录节点有无父节点1表示有0表示没有}
a,b,c,d:array[0..100] of integer;
{各种临时变量}
n,m,max,i,j:integer;
begin
{开文件}
assign(input,'find.in');reset(input);
assign(output,'find.out');rewrite(output);
{输入n,m}
readln(n,m);
{初始化节点孩子数为0,也可用fillchar过程}
for i:=1 to n do
c[i]=0;
{读树节点关系对,遍历所有关系对,每次为父节点的孩子节点数+1,即计算每个节点的孩子数,如果某个节点为另一个节点的孩子,那这个节点有父节点,即d数组对应为1}
for i:=1 to m do
begin
readln(a[i],b[i]);
inc(c[a[i]]);
d[b[i]]:=1;
end;
{找出root,如果一个节点没有父节点,即为root}
for i:=1 to n do if d[i]=0 then begin writeln(i); break end;
{取第一个节点的孩子数为基,遍历所有节点找出最大的孩子数,此时max变数最大的孩子节点数}
max:=c[1];
for i:=1 to n do
if c[i]>max then max:=c[i];
{找出有孩子节点数最多的节点,这步可在上步中一同进行,此时max变量表示拥有最大孩子节点数的节点号}
for i:=1 to n do
if c[i]=max then begin writeln(i); max:=i; break; end;
{输出,源代码中}
for i:=1 to m do
if a[i]=max then write(b[i],' ');
close(input);
close(output);
end.