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 ...
随机推荐
- Django 利用第三方平台实现用户注册02
前言: 上篇博客我们已经对设置了图形验证码,短信验证码对用户信息进行了一些简单的验证,本篇博客我们会将上篇的一些验证方法进行结合,来进一步完成我们的注册工作 1. 创建视图类 在user中的view创 ...
- 蓝桥杯 2n皇后问题
题意: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一 ...
- 实践 Network Policy 【转】
为了演示 Network Policy,我们先部署一个 httpd 应用,其配置文件 httpd.yaml 为: httpd 有三个副本,通过 NodePort 类型的 Service 对外提供服务. ...
- 139. Word Break 以及 140.Word Break II
139. Word Break Given a non-empty string s and a dictionary wordDict containing a list of non-empty ...
- 需要多个参数输入时-----------------考虑使用变种的Builder模式
业务需求: 创建一个不可变的Person对象,这个Person可以拥有以下几个属性:名字.性别.年龄.职业.车.鞋子.衣服.钱.房子. 要求: 其中名字和性别是必填项,而其他选填项可以根据情况自由输入 ...
- Arrays类常用方法
Arrays类 3.1 概述 java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等.其所有方法均为静态方法. 3.2 操作数组的方法 1.将参数数组变成字符串 publi ...
- Django(二) 模板:基本使用、模板语法、模板继承
一.模板的使用实战 接:https://blog.csdn.net/u010132177/article/details/103788677 参考:https://docs.djangoproject ...
- 十九、React UI框架Antd(Ant Design)的使用——及react Antd的使用 button组件 Icon组件 Layout组件 DatePicker日期组件
一.Antd(Ant Design)的使用:引入全部Css样式 1.1 antd官网: https://ant.design/docs/react/introduce-cn 1.2 React中使用A ...
- java第三周
- HDU1007 Quoit Design掷环游戏
Quoit Design 看懂题意以后发现就是找平面最近点对间距离除以2. 平面上最近点对是经典的分治,我的解析 直接上代码 #include<bits/stdc++.h> using n ...