#include <bits/stdc++.h>
using namespace std;
const int N=1010,M=20010,INF=0x3f3f3f3f;
struct node{
int to,nex,w;
}edge[M];
struct ver{
int id,type,dist;
bool operator> (const ver &w) const
{
return dist > w.dist;
}
};
int head[N],cnt=0;
int n,m,s,f;
int dis[N][2],dp[N][2];
bool st[N][2];
void addedge(int u,int v,int w)
{
edge[cnt].to=v;
edge[cnt].nex=head[u];
edge[cnt].w=w;
head[u]=cnt++;
}
int dijkstra()
{
memset(dis,INF,sizeof(dis));
memset(dp,0,sizeof(dp));
memset(st,false,sizeof(st));
priority_queue<ver,vector<ver>,greater<ver> > q;
dis[s][0]=0;
dp[s][0]=1;
q.push({s,0,0});
while(!q.empty())
{
ver p=q.top();
q.pop();
int u=p.id,type=p.type,dist=p.dist;
if(st[u][type]) continue;
st[u][type]=true;
for(int i=head[u];i!=-1;i=edge[i].nex)
{
int v=edge[i].to;
if(dis[v][0]>dist+edge[i].w)
{
dis[v][1]=dis[v][0],dp[v][1]=dp[v][0];
q.push({v,1,dis[v][1]});
dis[v][0]=dist+edge[i].w,dp[v][0]=dp[u][type];
q.push({v,0,dis[v][0]});
}
else if(dis[v][0]==dist+edge[i].w) dp[v][0]+=dp[u][type];
else if (dis[v][1] > dist + edge[i].w)
{
dis[v][1] = dist + edge[i].w, dp[v][1] = dp[u][type];
q.push({v, 1, dis[v][1]});
}
else if (dis[v][1] == dist + edge[i].w) dp[v][1] += dp[u][type];
}
}
int res=dp[f][0];
if(dis[f][1]==dis[f][0]+1)
res+=dp[f][1];
return res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(head,-1,sizeof(head));
cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
scanf("%d%d",&s,&f);
printf("%d\n",dijkstra());
}
}
次短路及次短路计数
最新推荐文章于 2023-09-19 10:03:51 发布