题源是https://www.acwing.com/problem/content/description/351/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005,M=1e6,mod=INT_MAX;
struct edge{
int v,w;
};
int d[N];
ll s[N];
bool vis[N];
vector<edge> g[M];
void dijsktra()
{
priority_queue<pair<int,int> > q;
memset(d,0x3f,sizeof(d));
d[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=0;i<g[x].size();i++)
{
int to=g[x][i].v;
int dis=g[x][i].w;
if(/*!vis[to]&&*/d[to]>dis+d[x])
{
d[to]=dis+d[x];
//v[to]=1;
//cout<<d[to]<<endl;
q.push(make_pair(-d[to],to));
}
}
}
}
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,l;
cin>>x>>y>>l;
g[x].push_back({y,l});
g[y].push_back({x,l});
}
dijsktra();
//for(int i=1;i<=n;i++) cout<<d[i]<<endl;
ll ans=1;
s[1]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<g[i].size();j++)
{
int to=g[i][j].v;
int dis=g[i][j].w;
if(d[to]==d[i]+dis)
{
s[to]++;
//cout<<to<<" "<<dis<<" "<<s[to]<<endl;
}
}
}
//for(int i=1;i<=n;i++) cout<<s[i]<<endl;
for(int i=1;i<=n;i++)
{
ans*=s[i]%mod;//ans = ans * s[i] % mod;
}
cout<<ans;
return 0;
}
ans*=s[i]%mod;改ans = ans * s[i] % mod;后AC? 原因不明 这2个还有什么区别吗??