1. (冗余关系)有一篇作文,第一行表示作文中的句子数目n 和人物数目m,下面n 句 (每句一行)描述人物关系的句子,描述了m 个人的关系(n<=1000)。每条句子的格式为:X Y。它的意思是:X 认识Y, Y 也认识X。现在要你求出文中冗余关系的数目。注意: 假如A 认识B,B 认识C,则A 也认识C。冗余关系的定义是指:即使没有这条关系,原图的所有关 系照样成立。
例如输入数据为:
3 4
1 4
1 3
4 3
则输出为:1
输出结果说明:共有1 个句子冗余(最后一句)。因为4 和3 的相识关系可从前面两句 推出。请完善下面程序。
const maxnm=1000;
var
n,m,i,j,k,t,tot,tmp:integer;
a:array[1..maxnm] of integer;
begin
readln(n,m);
tot:=0;
for i:=1 to m do
a[i]:=i ;
for k:=1 to n do begin
readln(i,j);
if a[i]=a[j] then
inc(tot) ;
else begin
if a[i]<a[j] then begin
tmp:=a[j];
for t:=1 to m do
if a[t]=tmp then a[t]:=a[i] ;
end
else begin
tmp:=a[i];
for t:=1 to m do
if a[t]=tmp then a[t]:=a[j] ;
end;
end;
end;
writeln(tot);
end.
2. (统计数字群个数) 某矩阵由数字0到9组成,其中0表示隔板(无法通过),数字1到9表示可以通过。一个数字群为:从某个数字非0数字出发,沿着可通行数字所能到达的所有数字(行走方向可以是上下左右),这些相互能到达的数字即组成同一数字群。给出矩阵,统计该矩阵包含的数字群的个数。
输入数据第一行表示矩阵的行数m和列数n,接下来m行,每行有连续的n个字符,每个字符均为数字0到9。输出数据只有一个,即该矩阵中包含的数字群个数。
例如输入数据如下:
3 8
01234000
10030008
79000600
则输出数据如下:
4
请完善下面程序。
const maxm=50; maxn=80;
var
m,n,i,j,k,tot:integer;
a:array[1..maxm,1..maxn] of 0..1;
b:array[1..4000,1..2] of integer;
st:string;
procedure bfs(p,q:integer);
var x,y,f,t:integer;
begin
f:=1;t:=1;
b[t,1]:=p;b[t,2]:=q;
a[p,q]:=0;
inc(t);
repeat
for k:=1 to 4 do begin
if k=1 then begin x:=p+1;y:=q; end;
if k=2 then begin x:=p;y:=q+1; end;
if k=3 then begin x:=p-1;y:=q; end;
if k=4 then begin x:=p;y:=q-1; end;
if (x>0) and (x<=m) and (y>0) and (y<=n) and (a[x,y]=1) then begin
b[t,1]:=x;
b[t,2]:=y;
a[x,y]:=0;
inc(t);
end;
end;
inc(f) ;
p:=b[f,1];q:=b[f,2];
f>t ;
end;
begin
readln(m,n);
fillchar(a,sizeof(a),0);
for i:=1 to m do begin
readln(st);
for j:=1 to n do
if st[j]<>'0' then a[i,j]:=1
end;
tot:=0;
for i:=1 to m do
for j:=1 to n do
if a[i,j]=1 then begin
bfs(i,j);
inc(tot) ;
end;
writeln(tot);
end.