最短路拓展。 详见: http://blog.csdn.net/leeeyupeng/archive/2010/08/06/5790928.aspx #include<iostream> #include<cstring> #include<cstring > using namespace std; #define maxcost 100000009 int head[1005]; int len; int sum,ans; class node { public: int len,v,next; }; node g[300050]; void add(int a,int b,int c) { g[++len].v =b; g[len].len =c; g[len].next =head[a]; head[a]=len; } int dist[1005][2],cnt[1005][2],vis[1005][2]; int dij(int n,int s,int f) { int i,j,k,x,y,dis,min; memset(cnt,0,sizeof(cnt)); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dist[i][0]=dist[i][1]=maxcost; dist[s][0]=0;cnt[s][0]=1; for(i=1;i<=2*n;i++) { min=maxcost; for(j=1;j<=n;j++) { if(!vis[j][0]&&min>dist[j][0]) { x=j;y=0;min=dist[j][0]; } else if(!vis[j][1]&&min>dist[j][1]) { x=j;y=1;min=dist[j][1]; } } if(min==maxcost) break; vis[x][y]=1; for(j=head[x];j;j=g[j].next ) { dis=min+g[j].len ; if(dis<dist[g[j].v ][0]) { dist[g[j].v ][1]=dist[g[j].v ][0]; cnt[g[j].v ][1]=cnt[g[j].v ][0]; dist[g[j].v][0]=dis; cnt[g[j].v ][0]=cnt[x][0]; } else if(dis==dist[g[j].v ][0]) { cnt[g[j].v ][0]+=cnt[x][0]; } else if(dis<dist[g[j].v ][1]) { dist[g[j].v ][1]=dis; cnt[g[j].v ][1]=cnt[x][y]; } else if(dis==dist[g[j].v ][1]) { cnt[g[j].v ][1]+=cnt[x][y]; } } } if(dist[f][1]-dist[f][0]==1) return cnt[f][1]+cnt[f][0]; else return cnt[f][0]; } int main() { int n,m,a,b,c,t; int s,f; cin>>t; while(t--) { len =0; memset(head,0,sizeof(head)); cin>>n>>m; for(int i=1;i<=m;i++) { cin>>a>>b>>c; add(a,b,c); } cin>>s>>f; ans=dij(n,s,f); cout<<ans<<endl; } return 0; }