第一道矩乘也就不口胡了吧
代码还是很simple的~
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(j,k,l) for (int j=k;j<=l;++j)
#define red(j,k,l) for (int j=k;j>=l;--j)
#define N 121
#define mod 45989
using namespace std;
int n,m,T,S,P,cnt,st[N],ne[N],to[N];
struct _233{
int poi[N][N];
void clear(){
rep(i,1,2*m) rep(j,1,2*m) poi[i][j]=0;
}
} a,b;
_233 operator*(_233 x,_233 y){
_233 p;
p.clear();
rep(i,1,2*m) rep(k,1,2*m) if (x.poi[i][k]>0) rep(j,1,2*m)
p.poi[i][j]=((p.poi[i][j]+x.poi[i][k]*y.poi[k][j])%mod);
return p;
}
void add(int k,int l){
to[++cnt]=l;
ne[cnt]=st[k];
st[k]=cnt;
}
_233 pow(int k){
_233 l=b,ans=b;
k--;if (k<0) ans.clear(),k=0;
while (k){
if (k&1) ans=ans*l;
l=l*l;
k=k>>1;
}
return ans;
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&T,&S,&P);
rep(i,1,m){
int k,l;
scanf("%d%d",&k,&l);
add(k,l);add(l,k);
a.poi[k][l]++;a.poi[l][k]++;
}
if (T<=1){
if (T==0) puts("0");
else printf("%d\n",a.poi[S][P]);
system("pause");
return 0;
}
rep(i,1,2*m)
for (int j=st[to[i]];j;j=ne[j])
if (((i+1)^(j+1))^1) b.poi[i][j]++;
b=pow(T-1);
int ans=0;
for (int i=st[S];i;i=ne[i])
for (int j=st[P];j;j=ne[j])
ans=(ans+b.poi[i][((j+1)^1)-1])%mod;
printf("%d\n",ans);
system("pause");
}