题目链接: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

最新文章

  1. Daily English
  2. 51NOD 1400 序列分解
  3. 使用ContentProvider管理多媒体-----向多媒体数据中添加数据
  4. python:redis简单操作
  5. Linux下使用JNI的常见问题及解决方案
  6. [Cocos2d-x v3.x]浅谈容器Vector
  7. PHP学习笔记-1——快捷键
  8. matlab for循环的三种类型
  9. mysql数据库第一弹
  10. select 下拉选择自动到textarea框
  11. 运用scrollPic插件的实例
  12. pl/sql实现打印九九乘法表
  13. IP-v4&amp;IP-v6
  14. 使用lite-server
  15. 绝对精品推荐做前端的看下:Web前端开发体会十日谈
  16. centos远程访问
  17. MYSQL的基本函数 (数学函数)
  18. SpringBatch Sample (一)(Hello World)
  19. Azure Storage架构介绍
  20. 《Gogoing》Alpha版使用说明

热门文章

  1. 2018-8-10-如何移动-nuget-缓存文件夹
  2. python 随机模块random
  3. 【python之路15】深浅拷贝及函数
  4. web服务发展历程
  5. git update-index --assume-unchanged忽略跟踪
  6. vue中 表头 th 合并单元格,且表格列数不定的动态渲染方法
  7. uni-app官方教程学习手记
  8. c中函数指针和回调函数
  9. 【风马一族_php】数组函数
  10. PyCharm2019 永久激活