题目链接:https://www.luogu.org/problem/P1144

其实这道题目是最短路的变形题,因为数据范围 \(N \le 10^6, M \le 2 \times 10^6\) ,所以直接用Dijkstra算法是不行的,可以使用 Dijkstra+堆优化 或者 SPFA算法来实现。

我这里使用 SPFA算法 来实现 (不会Dijkstra堆优化囧)

这道题目因为需要计数,所以需要在dist数组基础上再开一个cnt数组,其含义如下:

  • \(dist[u]\) :起点 \(1\) 到节点 \(u\) 的最短距离;
  • \(cnt[u]\) :起点 \(1\) 到节点 \(u\) 的最短路径长度。

然后队列扩展的时候:

  • 如果 \(dist[v] \gt dist[u]+1\) ,则更新 \(dist[v] = dist[u] + 1\) ,同时置 \(cnt[v] = cnt[u]\) ;
  • 如果 \(dist[v] = dist[u]+1\) ,则 \(cnt[v] += cnt[u]\)

这样就可以实现最短路计数(Dijkstra同理)。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
const long long INF = (1LL<<60);
const long long MOD = 100003LL;
vector<int> g[maxn];
queue<int> que;
int n, m, x, y;
long long dist[maxn], cnt[maxn];
bool inq[maxn];
void spfa() {
dist[1] = 0;
for (int i = 2; i <= n; i ++) dist[i] = -1;
cnt[1] = 1;
que.push(1);
while (!que.empty()) {
int u = que.front();
que.pop();
inq[u] = false;
int sz = g[u].size();
for (int i = 0; i < sz; i ++) {
int v = g[u][i];
if (dist[v] == -1 || dist[v] >= dist[u] + 1) {
if (dist[v] == -1 || dist[v] > dist[u] + 1) {
dist[v] = dist[u] + 1;
cnt[v] = cnt[u];
}
else {
cnt[v] = (cnt[v] + cnt[u]) % MOD;
}
if (!inq[v]) {
que.push(v);
inq[v] = true;
}
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
while (m --) {
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
}
spfa();
for (int i = 1; i <= n; i ++)
printf("%lld\n", cnt[i]);
return 0;
}

作者:zifeiy

P1144 最短路计数 题解 最短路应用题的更多相关文章

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

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

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

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

  3. Luogu P1144 最短路计数 【最短路】 By cellur925

    题目传送门 常规的最短路计数问题:注意有重边(重边不用理,看样例),自环(读入时过滤). 另外这个无向图没有权,其实可以直接bfs做,但考虑到以后带权的情况,按spfa走了. 水题被卡了三次(嘤嘤嘤 ...

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

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

  5. P1144 最短路计数

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

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

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

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

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

  8. 解题报告:luogu P1144 最短路计数

    题目链接:P1144 最短路计数 很简单的一道\(dfs\),然而我又跑了一遍\(dij\)和排序,时间复杂度是\(O(nlog n)\) 注意:\(1\).搜索时向\(dis[j]=dis[cur] ...

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

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

随机推荐

  1. GYM100741 A Queries

    A. Queries time limit per test 0.25 s memory limit per test 64 MB input standard input output standa ...

  2. 【洛谷P1204】【USACO1.2】挤牛奶Milking Cows

    P1204 [USACO1.2]挤牛奶Milking Cows 题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个 ...

  3. web前端学习(二)html学习笔记部分(7)--web存储2

    1.2.20  web存储 1.2.20.1  Web存储-客户端存储数据新方法 1.两种方式 1)localStorage - 没有时间限制的数据存储 2)针对一个sessionStorage - ...

  4. selenium(5):常用的8种元素定位

    selenium的webdriver提供了18种(注意不是8种)的元素定位方法,比较常用的定位方法是如下8种,xpath和css定位更加灵活,需要重点掌握其中一个. 经常会用到的8种定位:1.id定位 ...

  5. windbg双机调试

    win10  测试,当出现下列情况 ,请使用管理员身份运行 设置添加系统环境变量_NT_SYMBOL_PATH 的值为:srv*c:\symbols*http://msdl.microsoft.com ...

  6. 大数据技术之Hive

    第1章 Hive入门 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提 ...

  7. nginx+tomcat集群+redis(memcache)session共享!

    常用保持session的方式: 1.一些代理(比如nginxIP_hash) 1.使用数据库来存储Session 2.使用Cookie来存储Session                       ...

  8. oracle 共享服务器监控

    1.   观察sga的使用情况 select * from v$sgastat where pool=’large pool’; 2.   观察调度程序是否充足: 首先看每个调度程序的忙闲: sele ...

  9. SPA是什么?

    认识SPA 最早单页面的应用无从知晓,在2004年,google的Gmail就使用了单页面.到了2010年,随着Backbone的问世之后,此概念才慢慢热了起来. 随着后来React.Angular. ...

  10. easyUI + servlet 展示datagrid数据列表

    1:在jsp页面添加所用easyUI的js和css 2.前台代码示例: <table id="dgObj" style="width: 100%;height:90 ...