题解:
这道题首先先找出最短路,再寻找过程中保存所有可以进入该点并对该点可以贡献最短路的个数,然后再根据乘法原理将所有的乘起来就OK了
#include<bits/stdc++.h>
#define M 2147483647
using namespace std;
int head[2000005];
int next[2000005];
int ver[2000005];
int edge[2000005];
int vis[1005];
int dist1[1005];
queue<int>q;
int n,m,tot;
long long ans=1;
int fa[1005];
long long read(){
long long num=0;
char ch=getchar();
while(ch>'9'||ch<'0'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
num=(num<<1)+(num<<3)+ch-'0';
ch=getchar();
}
return num;
}
void add(int x,int y,int z){
ver[++tot]=y;
next[tot]=head[x];
edge[tot]=z;
head[x]=tot;
}
void bfs(int u){
dist1[u]=0;
vis[u]=1;
q.push(u);
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=next[i]){
if(dist1[ver[i]]==dist1[x]+edge[i]){
fa[ver[i]]++;
}
if(dist1[ver[i]]>dist1[x]+edge[i]){
dist1[ver[i]]=dist1[x]+edge[i];
fa[ver[i]]=1;
if(vis[ver[i]]) continue;
vis[ver[i]]=1;
q.push(ver[i]);
}
}
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) dist1[i]=100000000;
for(int i=1;i<=m;i++){
int x=read(),y=read(),z=read();
add(x,y,z);
add(y,x,z);
}
bfs(1);
for(int i=2;i<=n;i++) {
ans*=fa[i];
ans%=M;
}
printf("%lld",ans);
}