P1144 最短路计数

题目描述

给出一个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<=1000000,M<=2000000。

变形的spfa(说白了就是一个bfs),在进行最短路查询的时候判断是否出现了距离相同的路径。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 2000000
#define mod 100003
using namespace std;
queue<int>q;
bool vis[N];
int n,m,x,y,tot,head[N],ans[N],dis[N];
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
struct Edge
{
    int to,next,from;
}edge[N<<];
int add(int x,int y)
{
    tot++;
    edge[tot].to=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
int main()
{
    n=read(),m=read();
    ;i<=m;i++)
     x=read(),y=read(),add(x,y),add(y,x);
    memset(dis,0x3f3f3f3f,sizeof(dis));
    q.push(),dis[]=,vis[]=]=;
    while(!q.empty())
    {
        x=q.front();q.pop();vis[x]=false;
        for(int i=head[x];i;i=edge[i].next)
        {
            int to=edge[i].to;
            )
            {
                dis[to]=dis[x]+;
                ans[to]=ans[x]%mod;
                if(!vis[to])
                {
                    vis[to]=true;
                    q.push(to);
                }
            }
            )
            {
                ans[to]=(ans[x]+ans[to])%mod;
                if(!vis[to])
                {
                    vis[to]=true;
                    q.push(to);
                }
            }
        }
    }
    ;i<=n;i++)
     printf("%d\n",ans[i]);
    ;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
using namespace std;
struct Edge//邻接表存边
{
    int t;
    int nexty;
}edge[];
]={};//邻接表的东东(存以i为发出点的编号最大的边的编号)……有人不懂吗
;
inline void add(int a,int b)//邻接表添加边
{
    cnt++;
    edge[cnt].t=b;
    edge[cnt].nexty=head[a];
    head[a]=cnt;
}
]={};//每一个点的最短路径条数
]={};//用来避免重复的统计表,存当前在队列中,到节点i的最短路径条数
];//存最短路径
]={};//是否在队列中
queue<int>spfa;//SPFA所用队列
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a,b;
    ;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);//存边
    }
    ;i<=n;i++)dis[i]=2e9;
    dis[]=;//初始化dis
    ]=true;
    js[]=;//1到1最短路径1条
    rdjs[]=;//此次队列中,到1的最短路径条数为1
    spfa.push();//将1加入队列
    int curr;
    while(!spfa.empty())
    {
        curr=spfa.front();//更新发出点
        ;i=edge[i].nexty)//遍历出发边
        {
            )//若最短路有变
            {
                dis[edge[i].t]=dis[curr]+;//更新最短路
                rdjs[edge[i].t]=js[edge[i].t]=rdjs[curr]%;//以前的计数均舍弃,更新到出发点的到达路径条数
                if(!in[edge[i].t])
                {//加入队列

                    in[edge[i].t]=true;
                    spfa.push(edge[i].t);
                }
            }
            else
            )//若又有一条最短路
            {
                js[edge[i].t]=(js[edge[i].t]+rdjs[curr])%;//增加最短路个数
                rdjs[edge[i].t]=(rdjs[edge[i].t]+rdjs[curr])%;//在rdjs上更新,避免重复
                if(!in[edge[i].t])
                {//入队
                    in[edge[i].t]=true;
                    spfa.push(edge[i].t);
                }
            }
        }
        in[curr]=false;
        rdjs[curr]=;//此次的最短路统计已用完,将此节点的最短路条数初始化,避免重复(在此题中似乎并没有什么用)
        spfa.pop();//出队
    }
    ;i<=n;i++)printf("%d\n",js[i]);//输出
    ;
}

比较详细一点的题解

洛谷——P1144 最短路计数的更多相关文章

  1. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  2. 洛谷 P1144 最短路计数 解题报告

    P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...

  3. 洛谷 P1144 最短路计数 题解

    P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 输入格式 第一行包含\(2\)个正 ...

  4. 洛谷P1144 最短路计数 及其引申思考

    图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...

  5. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  6. 洛谷 P1144 最短路计数

    传送门:https://www.luogu.org/problemnew/show/P1144 这虽然是一道普及+的题,然而我发现我现在还没做过,这也就直接导致我今天模拟T2只杠了个暴力分…… 那这道 ...

  7. 洛谷P1144——最短路计数

    题目:https://www.luogu.org/problemnew/show/P1144 spfa跑最短路的同时记录cnt数组表示到达方案数. 代码如下: #include<iostream ...

  8. 洛谷P1144 最短路计数【堆优化dijkstra】

    题目:https://www.luogu.org/problemnew/show/P1144 题意:问1到各个节点的最短路有多少条. 思路:如果松弛的时候发现是相等的,说明可以经过该点的最短路径到达当 ...

  9. 洛谷 P1144 最短路计数 Label:水

    题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...

随机推荐

  1. MySQL练习50题

    介绍一个学习SQL的网站:https://sqlbolt.com/ 习题来源于网络,SQL语句是自己的练习答案,部分参考了网络上的答案. 花了一晚上的时间做完,个人认为其中的难点有:分组提取前几名的数 ...

  2. LeetCode(203) Remove LinkedList Elements

    题目 Remove all elements from a linked list of integers that have value val. Example Given: 1 –> 2 ...

  3. Party Games UVA - 1610 贪心

    题目:题目链接 思路:排序后处理到第一个不同的字符,贪心一下就可以了 AC代码: #include <iostream> #include <cstdio> #include ...

  4. PAT Basic 1073

    1073 多选题常见计分法 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一 ...

  5. HDU 3376 费用流 Matrix Again

    题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...

  6. stl vector 类

    目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此 ...

  7. webdriver高级应用- 高亮显示正在操作的页面元素

    #encoding=utf-8 import unittest from selenium import webdriver import time def highLightElement(driv ...

  8. Jmeter生成8位不重复的随机数

    jmeter的time函数${__time(,)}  :  默认该公式精确到毫秒级别, 13位数 ${__time(/1000,)}  : 该公式精确到秒级别, 10位数 ${__time(yyyy- ...

  9. 《程序员思维修炼》读书笔记——week4

    <程序员思维修炼>读书笔记——week4 PB16061441 陈昶金 这周读的是Andy Hunt的著作<程序员思维修炼>,这本书对于我这种刚刚入门的新手很友好,大多是讲一些 ...

  10. 如何杀死linux-zombie僵尸进程

    百科: ZOMBIE:僵尸状态,表示进程结束但尚未消亡的一种状态,此时进程已经结束运行并释放大部分资源,但尚未释放进程控制块. 与ZOMBIE对应的进程状态还有RUNNING(正在运行或等待运行状态) ...