简化题意:求最小路径树的个数
最小路径树: https://www.cnblogs.com/Lis-/p/11363768.html
#include<bits/stdc++.h>
using namespace std;
struct oppo{
int to,s,nex;
}rod[2000006];
int head[10005],tot;
void add(int from,int to,int s)
{
rod[++tot].to=to;
rod[tot].s=s;
rod[tot].nex=head[from];
head[from]=tot;
}
int dis[100005];
bool flag[10005];
int cnt[100005];
queue< int > v;
void spfa()
{
memset(dis,10,sizeof(dis));
v.push(1);
flag[1]=1;
dis[1]=0;
while(v.size())
{
int lxl=v.front();
flag[lxl]=0;
v.pop();
for(int i=head[lxl];i;i=rod[i].nex)
{
int to=rod[i].to;
if(dis[to]>dis[lxl]+rod[i].s){
dis[to]=dis[lxl]+rod[i].s;
if(!flag[to]){
flag[to]=1;
v.push(to);
}
}
}
}
}
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
spfa();
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=rod[j].nex)
if(dis[rod[j].to]==dis[i]+rod[j].s)
cnt[rod[j].to]++;
long long ans=1;
for(int i=2;i<=n;i++)
ans=ans*cnt[i]%2147483647;
cout<<ans<<"\n";
return 0;
}