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 ...
随机推荐
- 六 Hibernate多表操作&级联&外键维护
Hibernate的一对多关联映射 Hibernate的多对多关联映射 数据库表与表之间的关系:一对多,多对多,一对一 一对多:一个部门对应多个员工,一个员工只能属于一个部门.一个客户对应多个联系人, ...
- 5G/NR 波束管理
原文链接:http://www.sharetechnote.com/html/5G/5G_Phy_BeamManagement.html 1 为什么光束管理/光束控制? 我不认为高频部署中的波束传输信 ...
- KAZE特征和各向异性扩散滤波
kaze feature: http://www.doc88.com/p-6911376909693.html 各向异性扩散滤波 Scale-space and edge detection usi ...
- 020、MySQL创建一个存储过程,显示存储过程,调用存储过程,删除存储过程
一.我们创建一个MySQL储存过程,在SQL代码区写入以下内容,并执行就可以了 #编写一个存储过程 CREATE PROCEDURE ShowDate ( ) BEGIN #输出当前时间 SELECT ...
- 提升Essay写作说服力,需要注意这几个细节
很多留学生对于essay写作都不精通,能够勉强通过就不错了.那么Essay写作到底该怎么提分呢?可以从哪些方面入手?小编给同学们指几条路,相信可以帮到大家. 在有说服力的Essay中总结您的论点.尽管 ...
- Acwing198 反素数
原题面:https://www.acwing.com/problem/content/200/ 题目大意:对于任何正整数x,其约数的个数记作g(x),例如g(1)=1.g(6)=4.如果某个正整数x满 ...
- [BJDCTF2020]EasySearch
0x00 知识点 Apache SSI 远程命令执行漏洞 链接: https://www.cnblogs.com/yuzly/p/11226439.html 当目标服务器开启了SSI与CGI支持,我们 ...
- Python自学之路
2020年春节,受新型冠状病毒影响,整个春节假期,全国人民都在恐慌之中,为了避免大家上班相互传染,公司号召国家政策,开始上班日期延迟,在家呆的实在太无聊,突然感觉自己不能浪费这美好的时光,决定学习Py ...
- bzoj 1962: 模型王子
呵呵呵呵http://wenku.baidu.com/link?url=o0CPVzuBDLJMt0_7Qph1T7TtdFOzu7O-apIpvaWbIYMz8ZWqBneGqI8LGtLdqpuK ...
- Flutter Windows下AndroidStudio环境搭建
目前同类产品比较知名的有ReactNative,Flutter还有国内那家了uniapp了,流畅度理论上Flutter最快 官网:https://flutter.dev/docs/get-starte ...