题目链接:https://www.luogu.com.cn/problem/P1144
求到达每个点的最短路个数,从层次出发,采用bfs进行每一次搜索,通过vis控制回路问题
题目数据范围较大,采用动态建图
借鉴dalao代码
#include<cstdio> #include<cstdlib> #include<algorithm> #include<queue> using namespace std; const int maxn=1000000+1,maxm=2000000+1,INF=0x7f7f7f7f,MOD=100003; vector<int>G[maxn];int dep[maxn];bool vis[maxn];int cnt[maxn]; int main(){ int N,M;scanf("%d%d",&N,&M); for(int i=1;i<=M;i++){ int x,y;scanf("%d%d",&x,&y); G[x].push_back(y); G[y].push_back(x);//比邻接矩阵那种省空间 } queue<int>Q;dep[1]=0;vis[1]=1;Q.push(1);cnt[1]=1; while(!Q.empty()){ int x=Q.front();Q.pop(); for(int i=0;i<G[x].size();i++){ int t=G[x][i];//取出x访问到的点 if(!vis[t]){vis[t]=1;dep[t]=dep[x]+1;Q.push(t);} //如果到t的深度为到x的深度+1,那么将到t的原有数量再加上到x可走的数量,有亿点儿难 if(dep[t]==dep[x]+1) {cnt[t]=(cnt[t]+cnt[x])%MOD;} } } for(int i=1;i<=N;i++){ printf("%d\n",cnt[i]); } return 0; }