审题要严密!!
#include<bits/stdc++.h> using namespace std; int head[5000000],dis[5000000],t,l,n,m,k,p,ans,duan,sum[500000]; bool sign[5000000]; struct node { int to,nxt,val; } a[5000000]; inline void add(int from,int to,int v) { a[++l].to=to; a[l].val=v; a[l].nxt=head[from]; head[from]=l; } void dijkstra() { priority_queue < pair<int,int> > q; for(int i=1; i<=n; i++) dis[i]=123456789; dis[1]=0; q.push(make_pair(0,1)); while(q.size()) { int xx=q.top().second; q.pop(); if(sign[xx])continue; sign[xx]=1; for(int i=head[xx]; i; i=a[i].nxt) { int y=a[i].to; if(dis[y]>dis[xx]+a[i].val) { dis[y]=dis[xx]+a[i].val; sum[y]=sum[xx]; q.push(make_pair(-dis[y],y)); } else if(dis[y]==dis[xx]+a[i].val) sum[y]=(sum[y]+sum[xx])%p; } } } int main() { scanf("%d",&t); for(int tt=1; tt<=t; tt++) { memset(head,0,sizeof(head)); memset(sign,0,sizeof(sign)); memset(sum,0,sizeof(sum)); scanf("%d%d%d%d",&n,&m,&k,&p); sum[1]=1; for(int i=1; i<=m; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } dijkstra(); printf("%d ",sum[n]%p); } return 0; }