• 最短路计数


    最短路计数

    题目描述:
    给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
    输入输出格式
    输入格式:
    输入第一行包含2个正整数N,M,为图的顶点数与边数。
    接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。
    输出格式:
    输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。
    输入输出样例
    输入样例#1:
    5 7
    1 2
    1 3
    2 4
    3 4
    2 3
    4 5
    4 5
    输出样例#1:
    1
    1
    1
    2
    4
    说明:
    1到5的最短路有4条,分别为2条1-2-4-5和2条1-3-4-5(由于4-5的边有2条)。
    对于20%的数据,N≤100;
    对于60%的数据,N≤1000;
    对于100%的数据,N≤100000,M≤200000。

    #include<iostream>
    #include<queue>
    using namespace std;
    const int maxn=100010;
    const int mod=100003;
    int n,m,tot,dis[maxn],head[maxn],ans[maxn];
    bool flag[maxn];
    struct node
    {
        int to;
        int next;
    }e[maxn*4];
    void add_edge(int u,int v)
    {
        tot++;
        e[tot].to=v;
        e[tot].next=head[u];
        head[u]=tot;
    }
    void spfa()
    {
        queue<int> q;
        for(int i=1;i<=n;i++)
        dis[i]=maxn;dis[1]=0;
        q.push(1);flag[1]=1;
        ans[1]=1;
        while(!q.empty())
        {
            int u=q.front();
            flag[u]=0;q.pop();
            for(int i=head[u];i;i=e[i].next)
            {
                int v=e[i].to;
                if(dis[v]>dis[u]+1)
                {
                    dis[v]=dis[u]+1;
                    ans[v]=ans[u]%mod;
                    if(!flag[v])
                    {
                        q.push(v);
                        flag[v]=1;
                    }
                }
                else if(dis[u]+1==dis[v])
                {
                    ans[v]+=ans[u];
                    ans[v]%=mod;
                }
            }
        }
    }
    int main()
    {
        int x,y;
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
            cin>>x>>y;
            add_edge(x,y);
            add_edge(y,x);
        }
        spfa();
        for(int i=1;i<=n;i++)
        cout<<ans[i]<<endl;
        return 0;
    }
  • 相关阅读:
    跳跃游戏1,2
    重叠子区间问题
    最长公共子序列问题
    由leetcode俄罗斯套娃信封问题到C++的sort()函数学习
    一道笔试题,做的很垃圾
    Spring boot框架快速入门
    Redis常用数据类型及其对应的底层数据结构
    Java 类加载机制及双亲委派模型
    Java面试高频知识点总结 part3
    Spring框架专题
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070943.html
Copyright © 2020-2023  润新知