原题入口

这道题 一道有关于最短路的图论问题。 要求从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. css页面布局之左侧定宽,右侧自适应

    二列布局的特征是侧栏固定宽度,主栏自适应宽度.三列布局的特征是两侧两列固定宽度,中间列自适应宽度. 之所以将二列布局和三列布局写在一起,是因为二列布局可以看做去掉一个侧栏的三列布局,其布局的思想有异曲 ...

  2. centos ELK安装

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn ELK是进行日志收集分析用的,具体工作.原理.作用自行google. ...

  3. 捋一捋js面向对象的继承问题

    说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...

  4. IE8兼容问题总结---trim()方法

    1.IE8不支持,jquery的trim()去空格的方法 错误表现 : 会报错,对象不支持此属性或方法; 解决办法 : 使用正则匹配空格 例如 : /^\s+|\s+$/greplace(/^\s+| ...

  5. LIMS系统仪器数据采集-使用xpdf解析pdf内容

    不同语言解析PDF内容都有各自的库,比如Java的pdfbox,.net的itextsharp. c#解析PDF文本,关键代码可参考: http://www.cnblogs.com/mahongbia ...

  6. (转载)SVM-基础(二)

    支持向量机: Support Vector  by pluskid, on 2010-09-10, in Machine Learning     52 comments 本文是"支持向量机 ...

  7. Python多进程----从入门到放弃

    Python多进程 (所有只写如何起多进程跑数据,多进程数据汇总处理不提的都是耍流氓,恩,就这么任性) (1)进程间数据问题,因为多进程是完全copy出的子进程,具有独立的单元,数据存储就是问题了 ( ...

  8. flask中jinjia2模板引擎详解3

    接上文 模板继承 Jinji2中的模板继承是jinjia2比较强大的功能之一. 模板继承可以定义一个父级公共的模板,把同一类的模板框架定义出来共享. 这样做一方面可以提取共享代码,减少代码冗余和重复的 ...

  9. android判断网络是否可用

    private boolean isNetworkConnected(Context context) { ConnectivityMannger cManager = (ConnectivityMa ...

  10. 项目使用EntityFramework需要做的几项工作

    1..新项目引用创建好的其他项目,比如实体类库.数据库业务.实体数据模型等需要用到的项目进行引用. 2.新项目使用NuGet获取AutoMapper和EntityFramework程序包进行安装引用, ...