P1144 最短路计数 题解 最短路应用题
题目链接: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 最短路计数 题解 最短路应用题的更多相关文章
- 洛谷 P1144 最短路计数 题解
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 输入格式 第一行包含\(2\)个正 ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- Luogu P1144 最短路计数 【最短路】 By cellur925
题目传送门 常规的最短路计数问题:注意有重边(重边不用理,看样例),自环(读入时过滤). 另外这个无向图没有权,其实可以直接bfs做,但考虑到以后带权的情况,按spfa走了. 水题被卡了三次(嘤嘤嘤 ...
- 洛谷——P1144 最短路计数
P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...
- P1144 最短路计数
P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...
- 洛谷 P1144 最短路计数 解题报告
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...
- 洛谷P1144 最短路计数 及其引申思考
图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...
- 解题报告:luogu P1144 最短路计数
题目链接:P1144 最短路计数 很简单的一道\(dfs\),然而我又跑了一遍\(dij\)和排序,时间复杂度是\(O(nlog n)\) 注意:\(1\).搜索时向\(dis[j]=dis[cur] ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
随机推荐
- RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占优势
美国时间3月4-8日,国际知名信息安全峰会RSA Conference在美国旧金山开幕,云安全及云可以为企业提供更可靠的资产管理方式成为大会热点. 此次峰会共吸引全球700多家机构参展,其中近42%为 ...
- php语言的核心知识点
PHP:脚本语言,网站建设,服务器端运行PHP定义:一种服务器端的 HTML 脚本/编程语言,是一种简单的.面向对象的.解释型的.健壮的.安全的.性能非常之高的.独立于架构的.可移植的.动态的脚本语言 ...
- org.dom4j.Document 解析xml
1.Java代码 Document doc = DocumentHelper.parseText(xml); // Element rootE = doc.getRootElement(); List ...
- Python3.7.4入门-4模块
4 模块 Python有一种方法可以把定义放在一个文件里,并在脚本或解释器的交互式实例中使用它们.这样的文件被称作 模块 :模块中的定义可以 导入 到其它模块或者 主 模块 模块是一个包含Python ...
- querySelector与getElementBy系列的区别
getElementBy系列 document.getElementsByTagName('tag'); document.getElementById('id'); document.getElem ...
- POJ3614 [USACO07NOV]防晒霜Sunscreen
Sunscreen Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9333 Accepted: 3264 Descrip ...
- Leetcode4.Median of Two Sorted Arrays两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...
- Struts → 《Struts2程序开发》教材大纲
- iOS 9 新特性之实现 3D Touch
http://www.cocoachina.com/ios/20151027/13812.html 10月19号,周末,起床去吃早餐,吃完回来顺便去沃尔玛逛逛,把晚上的菜给买了,逛着逛着就来到了卖苹果 ...
- EasyUI 网格 一主多从 从表使用自定义树状展开
<table id="Table1" class="easyui-datagrid" title="标题" style="w ...