洛谷1144最短路计数(模板)
题目:https://www.luogu.org/problemnew/show/P1144
dp转移数量。
用了一下循环队列。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,xnt,head[1000005],cnt[1000005],x,y,dis[1000005]; int q[1000005],h=1,t=1; const int p=100003; bool in[1000005],fg,flag; struct Node{ int next,to; }edge[4000005]; void add(int x,int y) { edge[++xnt].next=head[x]; edge[xnt].to=y; head[x]=xnt; } void spfa() { while(1) { if(h==t)fg=1; int u=q[h]; in[u]=0;flag=0; for(int i=head[u];i;i=edge[i].next) { bool fl=0; int v=edge[i].to; if(v==u)continue; if(dis[u]+1<dis[v]) dis[v]=dis[u]+1,cnt[v]=cnt[u],fl=1; else if(dis[u]+1==dis[v]) cnt[v]=(cnt[v]+cnt[u])%p,fl=1; if(fl&&!in[v]) { in[v]=1;t++; if(t>1000005)t=1; q[t]=v; flag=1; } } if(fg&&!flag)break; else fg=0; h++; if(h>1000005)h=1; } } int main() { memset(dis,11,sizeof dis); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); add(x,y);add(y,x); } dis[1]=0; q[1]=1;cnt[1]=1;in[1]=1; spfa(); for(int i=1;i<=n;i++) printf("%d\n",cnt[i]); return 0; }