这是yhc大牛矩乘论文上的题目,那里面分析得很清楚了
这里就说说我一开始错的地方,我一开始处理每个时刻能通过的邻接矩阵的时候
把以不能访问的点i为起点和终点的都标记为0了,实际上只能标记以i为终点的边即可
很好理解,是自己太脑残了

  1 const mo=10000;
  2 var b,c,g,f:array[0..51,0..51] of longint;
  3     v:array[0..51,0..51] of boolean;
  4     w,d:array[0..51] of longint;
  5     a:array[0..15,0..51,0..51] of longint;
  6     fish,i,j,k,x,y,n,m,s,e,t:longint;
  7 
  8 procedure work(i:longint);
  9   var j,k:longint;
 10   begin
 11     a[i]:=f;
 12     for j:=1 to n do
 13       if v[j,i] then
 14       begin
 15         for k:=1 to n do
 16           a[i,k,j]:=0;
 17       end;
 18   end;
 19 
 20 procedure mul(p:longint);
 21   var i,j,k:longint;
 22   begin
 23     b:=c;
 24     for i:=1 to n do
 25       for j:=1 to n do
 26       begin
 27         c[i,j]:=0;
 28         for k:=1 to n do
 29           c[i,j]:=(c[i,j]+b[i,k]*a[p,k,j] mod mo) mod mo;
 30       end;
 31   end;
 32 
 33 procedure time;
 34   var i,j,k:longint;
 35   begin
 36     for i:=1 to n do
 37       for j:=1 to n do
 38       begin
 39         c[i,j]:=0;
 40         for k:=1 to n do
 41           c[i,j]:=(c[i,j]+g[i,k]*f[k,j] mod mo) mod mo;
 42       end;
 43   end;
 44 
 45 procedure quick(x:longint);
 46   var i,j:longint;
 47   begin
 48     j:=0;
 49     while x>0 do
 50     begin
 51       inc(j);
 52       d[j]:=x mod 2;
 53       x:=x shr 1;
 54     end;
 55     fillchar(c,sizeof(c),0);
 56     for i:=1 to n do
 57       c[i,i]:=1;
 58     for i:=j downto 1 do
 59     begin
 60       g:=c;
 61       f:=c;
 62       time;
 63       if d[i]=1 then
 64       begin
 65         g:=c;
 66         f:=b;
 67         time;
 68       end;
 69     end;
 70   end;
 71 
 72 begin
 73   readln(n,m,s,e,t);
 74   inc(s);
 75   inc(e);
 76   for i:=1 to m do
 77   begin
 78     readln(x,y);
 79     inc(x);
 80     inc(y);
 81     f[x,y]:=1;
 82     f[y,x]:=1;
 83   end;
 84   readln(fish);
 85   for i:=1 to fish do
 86   begin
 87     read(y);
 88     for j:=0 to y-1 do
 89     begin
 90       read(x);
 91       inc(x);
 92       k:=j;
 93       while k<=12 do
 94       begin
 95         v[x,k]:=true;
 96         k:=k+y;
 97       end;
 98     end;
 99   end;
100   for i:=0 to 12 do
101     work(i);
102   if t<12 then
103   begin
104     c:=a[1];
105     for i:=2 to t do
106       mul(i);
107   end
108   else begin
109     c:=a[1];
110     for i:=2 to 12 do
111       mul(i);
112     b:=c;
113     quick(t div 12);
114     for i:=1 to t mod 12 do
115       mul(i);
116   end;
117   writeln(c[s,e]);
118 end.
View Code

 

posted on 2014-12-31 20:53  acphile  阅读(129)  评论(0编辑  收藏  举报