码迷,mamicode.com
首页 > 其他好文 > 详细

[洛谷P1144]最短路计数

时间:2017-07-27 21:18:22      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:答案   eof   str   head   最短路径   cout   pre   main   add   

题目大意:求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;
}

 

[洛谷P1144]最短路计数

标签:答案   eof   str   head   最短路径   cout   pre   main   add   

原文地址:http://www.cnblogs.com/Mrsrz/p/7246983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!