迈出一大步[spfa]最短路计数

xiaoxiao2021-02-28  38

题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。

分析 SPFA,然后每次搜到新点给这个点加上之前的方案数就好啦 代码复杂度肯定比大佬们长啦

#include <iostream> #include <cstdio> using namespace std; int n,m,u[4000001],v[4000001],next[4000001],list[4000001],t[1000001],d[1000001],s[1000001],i,j,k; bool b[1000001]; void spfa() { int head=0,tail=1,i; b[1]=1; s[1]=1; t[1]=1; for (i=2;i<=n;i++) d[i]=214748; do { head++; i=list[s[head]]; while (i>0) { if (d[u[i]]+1<d[v[i]]) { d[v[i]]=d[u[i]]+1; if (!b[v[i]]) { b[v[i]]=1; tail++; s[tail]=v[i]; } } if (d[u[i]]+1==d[v[i]]) t[v[i]]+=t[u[i]]; t[v[i]]%=100003; i=next[i]; } b[s[head]]=0; } while (head!=tail); } int main() { scanf("%d%d",&n,&m); for (i=1;i<=m;i++) { k++; scanf("%d%d",&u[k],&v[k]); next[k]=list[u[k]]; list[u[k]]=k; k++; u[k]=v[k-1]; v[k]=u[k-1]; next[k]=list[u[k]]; list[u[k]]=k; } spfa(); for (i=1;i<=n;i++) printf("%d\n",t[i]); }
转载请注明原文地址: https://www.6miu.com/read-250341.html

最新回复(0)