1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include<cstdio> #include<cstring> #include<algorithm> #define cl(x,y) memset(x,y,sizeof(x)) using namespace std;
const int maxn=100005,maxe=200005; int tst,n,e,K,MOD; int son[maxe],nxt[maxe],lnk[maxn],w[maxe],tot; inline void add(int x,int y,int z){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;w[tot]=z; } int dst[maxn],que[maxn]; int vis[maxn]; void spfa(){ cl(dst,63);cl(vis,0); int hed=0,til=1; que[1]=1;dst[1]=0;vis[1]=1; while (hed!=til){ int x=que[hed=(hed+1)%maxn]; vis[x]=0; for (int j=lnk[x];j;j=nxt[j]) if (dst[son[j]]>dst[x]+w[j]){ dst[son[j]]=dst[x]+w[j]; if (!vis[son[j]]) vis[que[til=(til+1)%maxn]=son[j]]=1; } } } int f[maxn][55]; bool in[maxn][55]; int dfs(int x,int d){ if (in[x][d]) return -1; if (f[x][d]>=0) return f[x][d]; in[x][d]=1; int t; f[x][d]=(x==n&&d<=K); for (int j=lnk[x];j;j=nxt[j]){ int k=dst[x]+w[j]+d-dst[son[j]]; if (k<0||k>K) continue; (f[x][d]+=(t=dfs(son[j],k)))%=MOD; if (t<0) return -1; } in[x][d]=0; return f[x][d]; } int main(){ scanf("%d",&tst); while (tst--){ scanf("%d%d%d%d",&n,&e,&K,&MOD); cl(lnk,0);tot=0; for (int i=1,x,y,z;i<=e;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z); spfa(); cl(f,-1);cl(in,0); printf("%d\n",dfs(1,0)); } return 0; }
|