以边建矩阵快速幂。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 65 #define maxe 125 #define mod 45989 using namespace std; struct matrix { int a[maxe][maxe]; }a,b; int n,m,k,s,t,x,y,cnt[maxv][maxe],nume=0; void get_table() { for (int i=0;i<m;i++) for (int j=0;j<m;j++) b.a[i][j]=0; for (int i=0;i<n;i++) { for (int j=1;j<=cnt[i][0];j++) for (int k=1;k<=cnt[i][0];k++) if (j!=k) b.a[cnt[i][j]][cnt[i][k]^1]++; } for (int i=1;i<=cnt[s][0];i++) a.a[0][cnt[s][i]^1]++; } matrix mul(matrix a,matrix b) { matrix c; for (int i=0;i<m;i++) for (int j=0;j<m;j++) c.a[i][j]=0; for (int i=0;i<m;i++) for (int j=0;j<m;j++) for (int k=0;k<m;k++) c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%mod)%mod; return c; } void f_pow(int y) { while (y) { if (y&1) a=mul(a,b); b=mul(b,b); y>>=1; } } int main() { scanf("%d%d%d%d%d",&n,&m,&k,&s,&t); for (int i=1;i<=m;i++) { scanf("%d%d",&x,&y); cnt[y][++cnt[y][0]]=nume++; cnt[x][++cnt[x][0]]=nume++; } m<<=1;get_table(); f_pow(k-1); int sum=0; for (int i=1;i<=cnt[t][0];i++) sum=(sum+a.a[0][cnt[t][i]])%mod; printf("%d\n",sum); return 0; }