从A, R 到 t(R)={<a,b>,<a,c>,<b,c>,<d,g>,<e,g>} 我可以用现成的算法(比如wallshell)得到。
那从t(R)到 {a,b,c} {d,e,g} {f} 有没有什么方法可以快速得到?
因为t(R)里面现在只有5个二元关系对儿, 所以眼睛一看就可以写出来那3个集合了。如果t(R)里面存在海量比如1000万个关系对儿的话,那就得有个方法呀。作者: nil 时间: 2011-1-14 22:46
program relation;
const
n=20;
var
rc:packed array[1..n]of integer;
k,m:integer;
procedure init;
var
i:integer;
st:string;
begin
readln(st);
assign(input,st);reset(input);
readln(k,m);
for i:=1 to k do rc[i]:=i;
end;
procedure main;
var
i,j,p1,p2,t:integer;
begin
for i:=1 to m do
begin
read(p1,p2);
t:=rc[p2];
for j:=1 to k do
if rc[j]=t then rc[j]:=rc[p1];
end;
end;
procedure print;
var
i,t,a,b:integer;
begin
read(t);
for i:=1 to t do
begin
read(a,b);
if rc[a]=rc[b] then writeln('YES') else writeln('NO');
end;
close(input);
end;
begin
init;
main;
print;
end.作者: nil 时间: 2011-1-14 22:46
program relation;
const
n=20;
var
rc:packed array[1..n]of integer;
k,m:integer;
procedure init;
var
i:integer;
st:string;
begin
readln(st);
assign(input,st);reset(input);
readln(k,m);
for i:=1 to k do rc[i]:=i;
end;
procedure main;
var
i,j,p1,p2,t:integer;
begin
for i:=1 to m do
begin
read(p1,p2);
t:=rc[p2];
for j:=1 to k do
if rc[j]=t then rc[j]:=rc[p1];
end;
end;
procedure print;
var
i,t,a,b:integer;
begin
read(t);
for i:=1 to t do
begin
read(a,b);
if rc[a]=rc[b] then writeln('YES') else writeln('NO');
end;
close(input);
end;