题意:在顺利攻破Lord lsp的防线之后,lqr一行人来到了Lord lsp的城堡下方。Lord lsp黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商水平却没怎么增加。现在lqr已经搞清楚黑暗城堡有
经典的最短路径生成树问题。
我们先用
我们把所有节点按照
于是我们直接统计
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<algorithm>
#define mod 2147483647
using namespace std;
int n,m;
int head[1001010],cnt;
int s[1010];
int dis[1010],vis[1010];
struct node
{
int next;
int to;
int num;
}e[1001010];
void add(int from,int to,int num)
{
e[++cnt].next=head[from];
e[cnt].to=to;
e[cnt].num=num;
head[from]=cnt;
}
void dijkstra()
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1]=0;
priority_queue< pair<int,int> > q;
q.push(make_pair(0,1));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].num)
{
dis[v]=dis[u]+e[i].num;
q.push(make_pair(-dis[v],v));
}
}
}
}
int main()
{
scanf("%d%d",&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);
}
dijkstra();
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=e[j].next)
if(dis[e[j].to]==dis[i]+e[j].num)
s[e[j].to]++;
long long ans=1;
for(int i=1;i<=n;i++)
if(s[i])
ans=ans%mod*s[i]%mod;
printf("%lld",ans);
return 0;
}