[洛谷P1144]最短路计数

题目大意:求1到其他所有点的最短路径的条数

解题思路:SPFA(我觉得更像BFS),因为边权为1,所以最先搜到的那次一定是最短路径,在答案中增加父节点的答案数。以后每次搜到最短路径相同时,再在答案中添加当前父节点的答案数。(具体见代码)

C++ Code:

 

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
int ans[1000005]={0,1},head[4000010],nxt[4000010],to[4000010],dis[1000005];
int n,m,cnt=0;
queue<int>q;
inline void addedge(int x,int y){
	to[++cnt]=y;
	nxt[cnt]=head[x];
	head[x]=cnt;
	to[++cnt]=x;
	nxt[cnt]=head[y];
	head[y]=cnt;
}
void spfa(){
	memset(dis,0x3f,sizeof dis);
	dis[1]=0;
	q.push(1);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i];
			if(dis[v]==0x3f3f3f3f){//第一次到达,一定是最短路径。
				dis[v]=dis[u]+1;
				ans[v]+=ans[u];
				ans[v]%=100003;
				q.push(v);
			}else
			if(dis[v]==dis[u]+1)ans[v]=(ans[v]+ans[u])%100003;//又一次搜到最短路径,增加答案
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		addedge(x,y);
	}
	spfa();
	for(int i=1;i<=n;++i)cout<<ans[i]<<endl;
	return 0;
}

 

posted @ 2017-07-27 20:34  Mrsrz  阅读(506)  评论(0编辑  收藏  举报