原题入口

这道题 一道有关于最短路的图论问题。 要求从1开始求解最短路的条数。

这个题十分有趣,首先,跑裸的spfa(或者dijkstra)算出从1开始的最短路的长度。

再其次,计数的话,可以用记忆化搜索(相当于DAG dp)我们现在所遍历的路径长度要刚好是最短路的长度。

(这个程序中会有体现的)

这个题我前面一直在TLE,就是没有用记忆化,暴力去找路径。(第一遍还因为没算空间MLE。。TAT)

后来优化后 时间效率挺不错。(300多ms)

下面上代码:

 #include <bits/stdc++.h>
#define Set(a, v) memset(a, v, sizeof(a))
#define For(i, l, r) for(int i = (l); i <= (int)(r); ++i)
#define Fordown(i, r, l) for(int i = (r); i >= (int)(l); --i)
using namespace std; inline int read(){
int x = , fh = ; char ch;
for(; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -;
for(; isdigit(ch); ch = getchar()) x = (x<<) + (x<<) + (ch^'');
return x * fh;
} const int N = , M = << , inf = 0x3f3f3f3f;
const int mod = ; struct graph {
int to[M], Head[N], Next[M], val[M], e;
void init() {
e = ;
Set(Head, );
}
void add_edge (int u, int v, int w) {
to[++e] = v;
val[e] = w;
Next[e] = Head[u];
Head[u] = e;
}
};
graph G;
#define Travel(i, u, G) for(int i = G.Head[u]; i; i = G.Next[i])
//链式前向星的存图方式,Travel是遍历,这样便于我们写多图,而且挺方便的
bool inq[N];
int dis[N];
void spfa() {
queue<int> Q;
Set(dis, inf);
Q.push(); dis[] = ;
while (!Q.empty() ) {
int now = Q.front(); Q.pop();
inq[now] = false;
Travel(i, now, G) {
int v = G.to[i];
if (dis[v] > dis[now] + G.val[i]) {
dis[v] = dis[now] + G.val[i];
if (!inq[v]) { inq[v] = true; Q.push(v); }
}
}
}
}
//裸的spfa不解释 int dp[N]; //记忆化搜索所记忆的东西(表示到这个点最短路的条数)
int dfs(int u, int deep) { //deep存储从1到这个点的深度
if (dp[u]) return dp[u]; //如果已经到过这个点直接返回条数
Travel(i, u, G) {
int v = G.to[i];
if (deep - == dis[v]) //如果deep-1等于之前算出来的dis(最短路径)
//也就是说,当前我们所走的路径是可以走通的最短路之一
dp[u] = (dp[u] + dfs(v, deep-)) % mod; //计算路径个数,并继续向下递归
//很简单的一个加法原理
}
return dp[u]; //最后记得返回这个值
} int main (){
G.init();
int n = read(), m = read();
while (m--) {
int u = read(), v = read();
G.add_edge(u, v, );
G.add_edge(v, u, );
}
spfa();
dp[] = ;
For (i, , n)
dp[i] = dfs(i, dis[i]);
//我们从每一个点向起点走回去,所以一开始的深度是当前这个点的最短路
//这样可以解释之前为什么是deep-1了
For (i, , n)
printf ("%d\n", dp[i]);
//最后输出结果
}

luogu【P1144】最短路计数的更多相关文章

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

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

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

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

  3. 【luogu P1144 最短路计数】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1144 #include <iostream> #include <cstdio> # ...

  4. [Luogu P1144]最短路计数

    emmmm这个题看起来非常复杂,实际上仔细一分析发现到一个点最短路的个数就是所有前驱最短路个数之和.如果在图上表示也就是以1为根的bfs搜索树,一个点的最短路个数等于每一个能够向它扩展的所有点的最短路 ...

  5. P1144 最短路计数

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

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

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

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

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

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

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

  9. P1144 最短路计数 题解 最短路应用题

    题目链接:https://www.luogu.org/problem/P1144 其实这道题目是最短路的变形题,因为数据范围 \(N \le 10^6, M \le 2 \times 10^6\) , ...

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

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

随机推荐

  1. [Python Study Notes] python面试题总结

    python语法以及其他基础部分 可变与不可变类型: 浅拷贝与深拷贝的实现方式.区别:deepcopy如果你来设计,如何实现: __new__() 与 __init__()的区别: 你知道几种设计模式 ...

  2. C#中引用变量是否应该加ref?

    看如下代码:   void Test(T t); void Test(ref T t); 当T是值类型的时候,很好判断,第一种并不能改变方法外变量的值,需要第二种方法才可以.通过查看IL代码,可以看到 ...

  3. composer安装出现proc_open没有开启问题的解决方案

    今天在安装下载项目的时候,使用composer来安装依赖.遇到了 The Process class relies on proc_open, which is not available on yo ...

  4. 在Vue2.0中集成UEditor 富文本编辑器

    在vue的'项目中遇到了需要使用富文本编辑器的需求,在github上看了很多vue封装的editor插件,很多对图片上传和视频上传的支持并不是很好,最终还是决定使用UEditor. 这类的文章网上有很 ...

  5. 算法提高 金陵十三钗 状压DP

    思路:深度搜索复杂度N!过不了.考虑动态规划:将已经选择的列记为1,未选择表示0,二进制压缩,例如110,就表示选择了第1列和第2列. d(i, t)表示当前已经匹配了i行,选择了t这些列.状态转移: ...

  6. poj Hotel 线段树

    经典线段树的题. 每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度. 由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小: 1.如果当 ...

  7. 编写React组件的最佳实践

    此文翻译自这里. 当我刚开始写React的时候,我看过很多写组件的方法.一百篇教程就有一百种写法.虽然React本身已经成熟了,但是如何使用它似乎还没有一个"正确"的方法.所以我( ...

  8. LinkedHashMap概述

    1. LinkedHashMap概述: LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap. LinkedH ...

  9. 99%的人理解错 HTTP 中 GET 与 POST 的区别

    转自:http://www.oschina.net/news/77354/http-get-post-different GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发 ...

  10. Docker(一):Docker入门教程

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...