-
题目地址:https://www.luogu.org/problemnew/show/P1144
-
思路:
-
vector的新用法:Q[MAXN],Q[x].push_back(i),存进去从0开始。
- 所有路边权为一容易想到bfs;
-
“一个点最短路一定经过了一个层数比它少一的结点(否则不是最短路)。所以用每个相邻且层数比当前结点层数少一的点更新当前点的路径跳数即可。”
- 代码:
#include<bits/stdc++.h> #define MAXN 100005 #define mo 100003 using namespace std; int n,m,dep[MAXN],vis[MAXN],cnt[MAXN]; vector<int>Q[MAXN];queue<int>q; int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; Q[x].push_back(y); Q[y].push_back(x); } vis[1]=1;dep[1]=0;cnt[1]=1;q.push(1); while(!q.empty()){ int x=q.front(); q.pop(); for(int i=0;i<Q[x].size();i++){ int t=Q[x][i]; if(!vis[t]){vis[t]=1;dep[t]=dep[x]+1;q.push(t);} if(dep[t]==dep[x]+1){cnt[t]=(cnt[t]+cnt[x])%mo;} } } for(int i=1;i<=n;i++)cout<<cnt[i]<<endl; return 0; }