P1144 最短路计数
P1144 最短路计数
观察题目,
很容易很容易很容易想到……
\(bfs\)
因为每一条边的边权都是一定的——1,
所以其实我们完全不需要有任何的顾虑。
直接\(bfs\)搞起来。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,x,y,cnt;
queue<int> zdx;
int go[2000001],nxt[2000001],head[2000001],vis[2000001],dis[2000001],num[2000001];
void add(int u,int v){
go[++cnt] = v;
nxt[cnt] = head[u];
head[u]=cnt;
}//链式前向星
void bfs(int x){
zdx.push(x);
vis[x]=1;
dis[x]=0;
num[x]=1;
while(!zdx.empty()){
int asdfo=zdx.front();
zdx.pop();
for(int i=head[asdfo];i;i=nxt[i]){
int lzw=go[i];
if(!vis[lzw]){
dis[lzw]=dis[asdfo]+1;//最短边权累计
vis[lzw]=1;
zdx.push(lzw);
}
if(dis[lzw]==dis[asdfo]+1){
num[lzw]+=num[asdfo];
num[lzw]%=100003;//注意取模
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
bfs(1);
for(int i=1;i<=n;i++){
printf("%d\n",num[i]);
}
return 0;
}