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;
}
posted @ 2020-09-29 17:13  Luo_Feng_Han  阅读(75)  评论(0编辑  收藏  举报