题目描述
输入格式
输出格式
样例
输入
4 6
1 2 1
1 3 2
1 4 3
2 3 1
2 4 2
3 4 1
输出
6
题目大意:寻找满足条件的方案数。
分析:用spfa求出最短路,再用其求出每个节点满足条件的数量,并让他们相乘就是总方案树了(eg:1到2有3种方法,2到3有4种方法,则1到3有3×4=12种方法)。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6,mod=(1<<31)-1,inf=INT_MAX;
int n,m,cnt,head[N],dis[N],bk[N],cmp[N];
struct px
{
int ne,to,val;
} p[N];
void add(int from,int to,int val)
{
p[++cnt].to=to;
p[cnt].val=val;
p[cnt].ne=head[from];
head[from]=cnt;
}
void spfa()
{
int i;
queue<int>q;
for(i=2; i<=n; i++)
dis[i]=inf;
q.push(1);
bk[1]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
bk[x]=0;
for(i=head[x]; i; i=p[i].ne)
if(dis[p[i].to]>dis[x]+p[i].val)
{
dis[p[i].to]=dis[x]+p[i].val;
if(!bk[p[i].to]) q.push(p[i].to);
bk[p[i].to]=1;
}
}
}
int main()
{
int a,b,c,i,j;
long long ans=1;
ios::sync_with_stdio(0);
cin>>n>>m;
while(m--)
{
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
spfa();
for(i=1; i<=n; i++)
for(j=head[i]; j; j=p[j].ne)
if(dis[i]==dis[p[j].to]+p[j].val)
cmp[i]++;
for(i=1; i<=n; i++)
if(cmp[i]) ans=ans*cmp[i]%mod;
cout<<ans;
}