HZNU-ACM寒假集训Day4小结 最短路
最短路
1.Floy 复杂度O(N3) 适用于任何图(不存在负环)
模板 --kuangbin
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + ; int mp[maxn][maxn];
int n, m; int main() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) {
for (int j = ; j < m; j++) {
if (i == j) mp[i][j] = ;
else mp[i][j] = INF;
}
}
int u, v, w;
for (int i = ; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
mp[u][v] = w;
}
for (int k = ; k <= n; k++) {
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
}
}
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
printf("%10d", mp[i][j]);
}
printf("\n");
}
return ;
}
2.Dijkstra 适用于单源最短路 非负权图 堆优化 复杂度O((n+m)logm)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + ; struct Node {
int v, c; //c为到v点的最短路长度
Node(int _v = ,int _c=): v(_v),c(_c) {}
friend bool operator < (Node a, Node b) {
return a.c > b.c;
}
}; struct Edge {
int v, cost;
Edge(int _v = , int _cost = ) : v(_v), cost(_cost) {}
}; vector<Edge> E[maxn]; void add_edge(int u, int v, int w) {
E[u].push_back(Edge(v, w));
} int n, m;
bool vis[maxn];
bool dis[maxn]; void Dijkstra(int n, int start) {
memset(vis, , sizeof vis);
for (int i = ; i <= n; i++) dis[i] = INF;
priority_queue<Node> q;
while (!q.empty()) q.pop();
dis[start] = ;
q.push(Node(start, ));
Node tmp;
while (!q.empty()) {
tmp = q.top(); q.pop();
int u = tmp.v;
if (vis[u]) continue;
vis[u] = true;
for (int i = ; i < E[u].size(); i++) {
int v = E[tmp.v][i].v;
int cost = E[u][i].cost;
if (!vis[v] && dis[v] > dis[u] + cost) {
dis[v] = dis[u] + cost;
q.push(Node(v, dis[v]));
}
}
}
} int main() {
scanf("%d%d", &n, &m);
int u, v, w;
for (int i = ; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v, w);
}
Dijkstra(n, );
for (int i = ; i <= n; i++) printf("%d ", dis[i]);
return ;
}
Bellman-Ford 算法
用于求解单源最短路问题的算法 可以肯定最短路径包含的边条数不会超过n-1个,或者说结点不超过n个 若超过说明形成一个环,又环权值是正的我们可以路径上将这个环删除路径长度就会变小
可用于有向图判断是否存在负环
总复杂度O(NM)
relax(u, v) {
dist[v] = min(dist[v], dist[u] + edge_len(u, v));
}
for (i = ; i <= n; i++) {
dist[i] = edge_len(S, i);
}
for (i = ; i < n; i++) {
for each edge(u, v) {
relax(u, v);
}
}
Bellman-Ford 算法 优化 SPFA 最坏O(NM)
存在负边权时用SPFA
利用队列存储需要更新的结点,每次从队列中取出一个结点,计算是否有结点需要更新,如果有并且这个点不在队列里那么将它加入队列。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + ; struct Edge {
int v, cost;
Edge(int _v,int _cost): v(_v),cost(_cost) {}
}; vector<Edge> E[maxn]; void add_edge(int u, int v, int w) {
E[u].push_back(Edge(v, w));
} bool vis[maxn];
int cnt[maxn];
int dis[maxn]; bool spfa(int n, int start) {
memset(vis, , sizeof vis);
for (int i = ; i <= n; i++) dis[i] = INF;
vis[start] = true;
dis[start] = ;
queue<int> q;
while (!q.empty()) q.pop();
q.push(start);
memset(cnt, , sizeof cnt);
cnt[start] = ;
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = true;
for (int i = ; i < E[u].size(); i++) {
int v = E[u][i].v;
if (dis[v] > dis[u] + E[u][i].cost) {
dis[v] = dis[u] + E[u][i].cost;
if (!vis[v]) {
vis[v] = true;
q.push(v);
if (++cnt[v]> n) return false;
}
}
}
}
return true;
}
HZNU-ACM寒假集训Day4小结 最短路的更多相关文章
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- 中南大学2019年ACM寒假集训前期训练题集(入门题)
A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...
- HZNU-ACM寒假集训Day8小结 最小生成树
最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络 https://www.luogu.com.cn/problem/P1546 #i ...
- HZNU-ACM寒假集训Day3小结 搜索
简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...
- HZNU-ACM寒假集训Day1小结 STL 并查集
常用STL 1.优先队列 priority_queue 内部是用堆(heap)实现的 priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列” 对于一些 ...
- 2022寒假集训day4
day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...
- 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人
蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...
- HZNU-ACM寒假集训Day12小结 数论入门 题解
算不出的等式 BJOI2012 看到这题 真没什么办法 无奈看题解 1.注意到p/q 联想到斜率 2.注意到 [ ] 联想到整点 注意到k在变化,构造一次函数 f(x)=p/q*x ,g(x)=q/p ...
- HZNU-ACM寒假集训Day12小结 数论入门
符号说明 a|b a整除b (a,b) a与b的最大公因数 [a,b] a与b的最小公倍数 pα||a pα|a但pα+1∤a a≡b(mod m) a与b对模m同余 a ...
随机推荐
- python符号//、%和/运算
a = 9 print('这是%运算的结果'+str(a%2)) print('这是//运算的结果'+str(a//2)) print('这是/运算的结果'+str(a/2))运算结果为 这是%运算的 ...
- CF 1198 A. MP3 模拟+滑动窗口
A. MP3 题意:给你n个数,一个大小为8*I的容量,保存一个数需要多少容量取决于给定n个数的种类k,用公式 log2 k 计算,如果给定的容量不能保存所有数,选择减少数的种类来降低保存一个 ...
- Python安全基础编写
python所写的程序都是应用程序 python的环境编译型:一次性将所有程序编译成二进制文件缺点:开发效率低,不能跨平台优点:运行速度快使用语言:C,C++等等 解释型:当程序执行时,一行一行的解释 ...
- HiBench成长笔记——(9) Centos安装Maven
Maven的下载地址是:http://maven.apache.org/download.cgi 安装Maven非常简单,只需要将下载的压缩文件解压就可以了. cd /home/cf/app wget ...
- springCloud 之 Eureka服务治理
服务治理是微服务架构中最核心和基础的模块 首先我们创建一个springCloud eureka service的springboot 工程,该工程提供一个服务中心,用来注册服务,第二个工程是clien ...
- jmeter里面Dug Sampler 和json提取器的用法
1.编写用户详情请求 2.查看结果树 一级一级往上查找父集 3.添加json提取器 步骤:点击[用户详情]请求->添加->后置处理器->json提取器 把查看结果树里面的JSON P ...
- Swift Access Levels (变量关键字访问权限)
- Android的事件处理机制之基于监听的事件处理
无论是桌面应用还是手机应用程序,面对用户的使用,经常需要处理的便是用户的各种动作,也就是需要为用户动作提供响应,这种为用户动作提供响应的机制就是事件处理. 而Android为我们提供了两套强大的响应机 ...
- 八、Delphi10.3读取JSON文件,并修改JSON数组一条内容后保存到文件
一.我们有一个JSON文件,如下: { "在野": [ { "城池": 0, "武将": 74, "登场年": 190 ...
- MapReduce On Yarn的执行流程
1.概述 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序. Yarn的架构如下图所示: ...