zoukankan      html  css  js  c++  java
  • 最短路计数

    基本思路:正常dijkstra+记录路径

    注意:路径求模

    代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<queue>
    using namespace std;
    const int Max_N=1000010,Max_M=2000010,inf=2147432637;
    typedef pair<int,int>node;
    struct Edge
    {
        int next,dis,to;
    } E[Max_M*2];//注意是无向图
    int Head[Max_N],num_Edge,Dis[Max_N],vis[Max_N],Ans[Max_N];
    int N,M;
    inline int Read(void)//快读
    {
        int w=0,x=0;
        char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
        return w?-x:x;
    
    }
    inline void Add_Edge(int from,int to,int dis)//建边
    {
        E[++num_Edge].dis=dis;
        E[num_Edge].next =Head[from];
        E[num_Edge].to =to;
        Head[from]=num_Edge;
    }
    inline void Dijkstra()
    {
        priority_queue< node,vector<node>,greater<node> >Q;
        for(int i=2; i<=N; ++i) Dis[i]=inf;
        Ans[1]=1;
        Q.push(make_pair(0,1)) ;
        while(!Q.empty())
        {
            int u=Q.top() .second;
            Q.pop() ;
            if(vis[u])continue;
            else vis[u]=1;
            for(int i=Head[u]; i; i=E[i].next )
            {
                int v=E[i].to;
                if(Dis[v]==Dis[u]+E[i].dis )//累计最短路条数 
                    Ans[v]=(Ans[v]+Ans[u])%100003;
                else if(Dis[v]>Dis[u]+E[i].dis )//如果找到更短路,重新统计最短路条数 
                {
                    Ans[v]=Ans[u]%100003;
                    Dis[v]=Dis[u]+E[i].dis ;
                    if(!vis[v]) Q.push(make_pair(Dis[v],v)) ;
                }
            }
    
    
        }
    }
    int main(void)
    {
        N=Read(),M=Read();
        for(int i=1; i<=M; ++i)
        {
            int u=Read(),v=Read();
            Add_Edge(u,v,1);
            Add_Edge(v,u,1);
        }
        Dijkstra();
    
        for(int i=1; i<=N; ++i)    printf("%d
    ",Ans[i]%100003);//注意求模 
        return 0;
    }
  • 相关阅读:
    你所不知道的 C# 中的细节
    数据分析与数据挖掘 ---- 系列教程
    Tiny Core Linux 安装配置
    Debian 安装
    基于C#的内网穿透学习笔记(附源码)
    Layui前端框架介绍
    使用 C# 捕获进程输出
    sonar扫描——方法重构分析
    消除代码中的坏味道,编写高质量代码
    TensorFlow之张量
  • 原文地址:https://www.cnblogs.com/Blacktears/p/11558933.html
Copyright © 2011-2022 走看看