题目描述
Bruce在A州成立了公司,准备宣传活动开始后的第L天到达B州进行新品拍卖,期间Bruce打算将产品拿到各个州去做推销宣传。 该国有很多个州,每个州都与其他一些州相邻,但是该国有规定:
商人只能从某些州到达另外一些州,即连通路线是单向的。
商人不允许在同一个州连续宣传两天或以上,每天宣传完必须离开该州。
商人可以多次来到同一个州进行宣传。
任务:算出AB两州之间的路线的总数。
输入格式
第一行包含三个整数n,m,L(1≤n,L≤100),表示n个州、m条通路,L天后必须到达B州。
接下来有m行,每行一对整数x,y(1≤x,y≤n),表示从x州到y州有通路。
第m+2行:一个整数k(k≤100)
接下来k行,每行两个整数A,B
输出格式
k行,每行一个整数,表示从第k次输入的A州到第k次输入的B州满足规定的路线总数。(<2^31)
样例输入
4 5 6
1 2
2 3
3 4
4 1
2 4
1
1 4
样例输出
2
题目分析:这个题目被划分到了搜索中,我实在不知道搜索怎么能够做过去,只好用dp,在相关题解中好像很多都是用DP做的
令f[i,j]表示在第j天,到达第i个州的路线方案总数,当然f[i,j]=sum(f[x,j-1])前j-1天与i州相连的州的路线方案总数啦

代码program p579;
var f:array[1..100,0..100]of longint;
a:array[1..100,1..100]of 0..1;
n,m,l,k,start,over:longint;
procedure init;
var i,j,x,y,p,q:longint;
begin
assign(input,'input.txt');
reset(input);
assign(output,'output.txt');
rewrite(output);
readln(n,m,l);
fillchar(a,sizeof(a),0);
for i:=1 to m do
begin
readln(x,Y);
a[x,y]:=1;
end;
readln(k);
fillchar(f,sizeof(f),0);
for i:=1 to k do
begin
readln(start,over);
f[start,0]:=1;
for j:=1 to l do
for p:=1 to n do
for q:=1 to n do
if (a[p,q]=1)and(f[p,j-1]<>0)and(p<>q) then
begin
f[q,j]:=f[p,j-1]+f[q,j];
end;
writeln(f[over,l]);
fillchar(f,sizeof(f),0);
end;
close(input);
close(output);
end;
begin
init;
end.
程序的时间复杂度比较高啊,但是很容易想到,反正通过了…………囧^^^^^^^^
………………………………由jackerjay原创,转载请注明出处^^^