zoukankan      html  css  js  c++  java
  • [洛谷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;
    }
    
  • 相关阅读:
    win10家庭版转专业版并激活
    关于vcruntime140D.dll丢失问题
    phpMyAdmin使用教程
    在wamp中直接进入项目
    sublime Text3的使用
    wamp的安装配置
    PHP Web开发入门流程
    PHP与MySQL的亲密接触
    flex 布局 实现电商页面商品展示floor
    html css+div+jquery实现图片轮播
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7246983.html
Copyright © 2011-2022 走看看