\[ \prod_{i=2}^{n}ind[x] \]
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 1001
#define maxm 1000001
#define mod ((1<<31)-1)
using namespace std;
vector<int> to[maxn],w[maxn];
int dis[maxn],ind[maxn];
bool vis[maxn];
int n,m;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
inline void dijkstra(){
memset(dis,0x3f,sizeof dis);
priority_queue< pair<int,int>,vector< pair<int,int> >,greater< pair<int,int> > > q;
q.push(make_pair(0,1)),dis[1]=0;
while(q.size()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=true;
for(register int i=0;i<to[u].size();i++){
int v=to[u][i];
if(dis[v]>dis[u]+w[u][i]){
dis[v]=dis[u]+w[u][i],ind[v]=1;
q.push(make_pair(dis[v],v));
}else if(dis[v]==dis[u]+w[u][i]) ind[v]++;
}
}
}
int main(){
n=read(),m=read();
for(register int i=1;i<=m;i++){
int u=read(),v=read(),_w=read();
to[u].push_back(v),w[u].push_back(_w);
to[v].push_back(u),w[v].push_back(_w);
}
dijkstra();
long long ans=1;
for(register int i=2;i<=n;i++) ans=(1ll*ans*ind[i])%mod;
printf("%lld\n",ans);
return 0;
}
原文:https://www.cnblogs.com/akura/p/10951832.html