最短路计数
这题要用dij,,不知道spfa为什么会出锅,也不会改
就对每个点记录一个cnt
每次更新最短路的时候就将x的cnt传给to
如果最短路相等,就给to的cnt加上x的cnt
然后就是dij板子,,其实就是个板子加上一点修改,,
#include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=2005; int head[N],d[N],ans[N]; int mp[N][N]; bool in[N]; int cnt,n,m; struct node{ int to,nxt,dis; }e[(N*N)<<1]; struct edge{ int val,num; bool operator < (const edge &x)const{ return val>x.val; } }; inline void add(int from,int to,int dis){ e[++cnt]=(node){to,head[from],dis}; head[from]=cnt; } priority_queue<edge>q; void spfa(){ q.push((edge){0,1}); d[1]=0;ans[1]=1; while(!q.empty()){ int t=q.top().num; q.pop(); if(in[t])continue; in[t]=1; for(int i=head[t];i!=0;i=e[i].nxt){ if(!in[e[i].to]&&d[e[i].to]>d[t]+e[i].dis){ d[e[i].to]=d[t]+e[i].dis; ans[e[i].to]=ans[t]; q.push((edge){d[e[i].to],e[i].to}); } else if(d[e[i].to]==d[t]+e[i].dis) ans[e[i].to]+=ans[t]; } } } int main(){ int x,y,z; scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ scanf("%d%d%d",&x,&y,&z); if(mp[x][y]==0||mp[x][y]>z){ add(x,y,z);mp[x][y]=z; } } for(int i=1;i<=n;++i) d[i]=1e9; spfa(); if(d[n]==1e9)printf("No answer"); else printf("%d %d",d[n],ans[n]); return 0; }