传话 Pascal程序

来源:百度知道 编辑:UC知道 时间:2024/06/21 19:02:14
传话(message.pas/c/cpp)
[问题描述]
兴趣小组的同学来自各个学校,为了增加友谊,晚会上又进行了一个传话游戏,如果a认识b,那么a收到某个消息,就会把这个消息传给b,以及所有a认识的人。
如果a认识b,b不一定认识a。
所有人从1到n编号,给出所有“认识”关系,问如果i发布一条新消息,那么会不会经过若干次传话后,这个消息传回给了i,1<=i<=n。
[输入文件]
输入文件message.in中的第一行是两个数n(n<1000)和m(m<10000),两数之间有一个空格,表示人数和认识关系数。
接下来的m行,每行两个数a和b,表示a认识b。1<=a, b<=n。认识关系可能会重复给出,但一行的两个数不会相同。
[输出文件]
输出文件message.out中一共有n行,每行一个字符T或F。第i行如果是T,表示i发出一条新消息会传回给i;如果是F,表示i发出一条新消息不会传回给i。
[输入样例]
4 6
1 2
2 3
4 1
3 1
1 3
2 3
[输出样例]
T
T
T
F

先把有向图建立起来:a[i,j]=1表示i能到j, 然后利用递归进行宽搜,搜索时注意从一点到另一点搜过一次就不能再搜,以免引起死循环。在搜索的过程中注意剪枝,否则有的点会超时。
参考程序如下:
const
maxn=1000;
var
n,m,i,j,x,y:longint;
a:array[1..maxn,1..maxn] of boolean;
v:array[1..maxn] of boolean;
function dfs(x,root:longint):boolean;
var
j:longint;
f:boolean;
begin
v[x]:=true; f:=false;
for j:=1 to n do begin
if a[x,j] and not v[j] then begin
f:=f or dfs(j,root);
if f then begin dfs:=true; exit; end;
end
else if (j=root) and (a[x,j]) then begin
dfs:=true; exit; end;
end;
dfs:=f;
end;
begin
assign(input,'message.in'); reset(input);
assign(output,'message.out'); rewrite(output);
readln(n,m);
fillchar(a,sizeof(a),false);
for i:=1 to m do begin
readln(x,y);
a[x,y]:=true;
end;
for i:=1