算法:DFS
分析:题目是求从任意一个点开始到任意一个点结束,其中的路径长度为N,且中间不构成环的这样的情况有多少种。(有向图)
program count;
const
maxn=8;
var
s:array [0..maxn] of ansistring;
f:array [0..maxn] of longint;{用f[i]表示是谁发现的i。}
n,ans:longint;
procedure init;
var
i:longint;
begin
readln(n);
for i:=1 to n do f[i]:=i;
for i:=1 to n do readln(s[i]);
end;
function getf(x:longint):longint;{并查集,但是不能改变父亲节点。}
begin
if x=f[x] then exit(x)
else exit(getf(f[x]));
end;
procedure dfs(t,dep:longint);
var
i:longint;
begin
if dep=n+1 then
begin
inc(ans);
exit;
end;
if t=dep then dfs(t,dep+1);{因为枚举以t为起点,因此不能有人发现t。}
for i:=1 to n do
begin
if (i<>dep) and (s[i,dep]='1') and (getf(i)<>dep) then{不能自己发现自己,并且确认i不是被dep发现的,如果是的话再继续就形成了互相指的局面。}
begin
f[dep]:=i;{记录dep是i发现的。}
dfs(t,dep+1);
f[dep]:=dep;
end;
end;
end;
procedure main;
var
i:longint;
begin
for i:=1 to n do dfs(i,1);
end;
begin
assign(input,'count.in'); reset(input);
assign(output,'count.out'); rewrite(output);
init;
main;
writeln(ans);
close(input); close(output);
end.
1580

被折叠的 条评论
为什么被折叠?



