最短路

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小结 最短路的更多相关文章

  1. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  2. 中南大学2019年ACM寒假集训前期训练题集(入门题)

    A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...

  3. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  4. HZNU-ACM寒假集训Day3小结 搜索

    简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...

  5. HZNU-ACM寒假集训Day1小结 STL 并查集

    常用STL 1.优先队列 priority_queue 内部是用堆(heap)实现的 priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列” 对于一些 ...

  6. 2022寒假集训day4

    day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...

  7. 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人

    蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...

  8. HZNU-ACM寒假集训Day12小结 数论入门 题解

    算不出的等式 BJOI2012 看到这题 真没什么办法 无奈看题解 1.注意到p/q 联想到斜率 2.注意到 [ ] 联想到整点 注意到k在变化,构造一次函数 f(x)=p/q*x ,g(x)=q/p ...

  9. 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 ...

随机推荐

  1. Day5-T1

    原题目 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿.为了省事,小月言想切最少的刀数,使这n根火腿分成均等的m份.请问最少要切几刀? 第一行一 ...

  2. 基于线程池、消息队列和epoll模型实现并发服务器架构

    引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...

  3. R 《回归分析与线性统计模型》page164 单变量、多变量多项式模型

    --多项式回归模型 --单变量多项式模型 --多变量多项式模型 rm(list = ls()) library(openxlsx) library(leaps) #单变量多项式模型# data = r ...

  4. u盘使用记录、痕迹删除技巧方法

    在日常生活的使用U盘过程当中,系统会记录下大量U盘的使用记录信息,那么接下来小编就来同大家分享介绍如何删除掉这些使用记录的方法知识. 1. 往系统里面添加环境变量devmgr_shownonprese ...

  5. mysql 结果排序入门

  6. 又一个无效的列类型错误Error setting null for parameter #7 with JdbcType NULL . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLExcept

    在更新数据时候出现的错误 更新代码如下: <update id="modify" parameterType="Standard"> update ...

  7. 【LeetCode】接雨水

    [问题] 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况 ...

  8. Oracle 组函数count()

    1.count() 函数的参数除了可以是字段值和表达式外,还可以是“ * ”.如果是字段值或表达式,则忽略空值且考虑重复值:如果是“ * ”,则计算所有的行,也包括空值.如果要查询某字段非重复值的个数 ...

  9. 一百一十一、SAP的OO-ALV之五,显示ALV表格

    一.在屏幕里面有2部分,(PROCESS BEFORE OUTPUT 用于显示, PROCESS AFTER INPUT用于数据处理).我们创建的display_alv函数, 二.display_al ...

  10. HDU 1542 线段树离散化+扫描线 平面面积计算

    也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...