洛谷 P1144 最短路计数 题解

时间:2022-02-24 10:48:00

P1144 最短路计数

题目描述

给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\)。问从顶点\(1\)开始,到其他每个点的最短路有几条。

输入格式

第一行包含\(2\)个正整数\(N,M\),为图的顶点数与边数。

接下来\(M\)行,每行\(2\)个正整数\(x,y\),表示有一条顶点\(x\)连向顶点\(y\)的边,请注意可能有自环与重边。

输出格式

共NN行,每行一个非负整数,第ii行输出从顶点11到顶点ii有多少条不同的最短路,由于答案有可能会很大,你只需要输出\(ans \bmod 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\)。

【思路】

最短路 , dijkstra

【题目大意】

从1到每一个点的最短路有多少条

【核心思路】

最短路有多少条?

完全可以在dijkstra或者SPFA的过程中求出来的

因为在松弛操作的时候

用y到x的边去松弛

如果这条边替换上去会使1到x的距离更近

那这个时候x的答案就会变为松到他y的最短路的个数

如果这条边替换上去和原来一样

那就是目前看来可以当做最短路

在x原来最短路个数的基础上加上到点y最短路的个数就可以了

【完整代码】

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring> using namespace std; int read()
{
int sum = 0,fg = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')fg = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
sum = sum * 10 + c - '0';
c = getchar();
}
return sum * fg;
}
const int Max = 2000006;
const int mo = 100003;
struct node
{
int y,ne;
}a[Max << 1];
int head[Max >> 1],sum = 0; void add(int x,int y)
{
a[++ sum].y = y;
a[sum].ne = head[x];
head[x] = sum;
} struct point
{
int x;
int w;
bool operator < (const point xx) const
{
return xx.w < w;
}
};
int dis[Max >> 1];
priority_queue<point>q;
int ans[Max >> 1];
bool use[Max >> 1];
void dj()
{
memset(dis,0x3f,sizeof(dis));
dis[1] = 0;
ans[1] = 1;
q.push((point){1,0});
while(!q.empty())
{
point qwq = q.top();
q.pop();
int x = qwq.x,w = qwq.w;
if(use[x] == true)
continue;
else
use[x] = true;
for(register int i = head[x];i != 0;i = a[i].ne)
{
int awa = a[i].y;
if(dis[awa] > dis[x] + 1)
{
dis[awa] = dis[x] + 1;
ans[awa] = ans[x];
if(use[awa] == false)
q.push((point){awa,dis[awa]});
}
else
if(dis[awa] == dis[x] + 1)
{
ans[awa] += ans[x];
ans[awa] %= mo;
}
}
}
} int main()
{
int n = read(),m = read();
for(register int i = 1;i <= m;++ i)
{
int x = read(),y = read();
add(x,y);
add(y,x);
}
dj();
for(register int i = 1;i <= n;++ i)
cout << ans[i] << endl;
return 0;
}

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

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

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

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

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

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

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

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

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

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

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

  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&colon;水

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

随机推荐

  1. 再次思考 classpath 环境变量 等

    f:\aspectj1.8\lib\aspectjrt.jar;.;%JAVA_HOME%\lib;C:\Temp\IBM\SQLLIB\java\db2java.zip;C:\Temp\IBM\SQ ...

  2. 使用gulp&plus;browser-sync搭建前端项目自动化以及自动刷新

    前段时间使用了gulp+browser-sync才发现这个东西真的很好用. 准备工作:(1).安装nodejs.gulp是基于nodejs使用的,所以先安装nodejs,https://nodejs. ...

  3. Leetcode Find K Pairs with smallest sums

    本题的特点在于两个list nums1和nums2都是已经排序好的.本题如果把所有的(i, j)组合都排序出来,再取其中最小的K个.其实靠后的很多组合根本用不到,所以效率较低,会导致算法超时.为了简便 ...

  4. iOS关于CGContextSetBlendMode&colon; invalid context 0x0的错误

    在ios 7的模拟器中,选择一个输入框准备输入时,会触发这个错误,以下是出错详细日志: <Error>: CGContextSetBlendMode: invalid context 0x ...

  5. WinForm多线程及委托防止界面假死

    当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决. using System; using System.Collections.Generi ...

  6. Python之路:Python 函数

    一.函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装 二. 函数的定义和使用 def 函数名(参数): ... 函数体 ... 函数的定义主要有 ...

  7. PHP于DIRECTORY&lowbar;SEPARATOR任务

    DIRECTORY_SEPARATOR是php的内部常量.用于显示系统分隔符的命令,不须要不论什么定义与包括就可以直接使用. 在windows下路径分隔符是\(当然/在部分系统上也是能够正常执行的), ...

  8. 利用fiddler将本地网页放到某个域下

    注: 1)在学习慕课网课程<搜索框制作>中遇到如题困难,查找资料后解决,做此记录.课程网址http://www.imooc.com/video/263. 2)建议同时去学习慕课网课程&lt ...

  9. VBS连接远程Oracle

    原文链接:http://hi.baidu.com/coo_boi/item/5a2e1860ded285136995e6a7 连接方式还是用的ADO,驱动是MSDAORA. 使用oracle前,ora ...

  10. 过滤掉文本中的javascript标签代码

    2014年1月21日 11:51:19 php代码: $content = preg_replace('#<\s*[script].*>#', '', $a);//有些攻击可以在scrip ...