三月算法学习总结
三月算法学习总结
2020-3-23
一:图论基本算法:
几个概念:
度数:无向图中一个点连出去的边数
联通:两个点通过路径相连
拓扑图:没有环的图、
三无图:无向,无重边,无自环
割点:删除这个点之后图不连通
桥边: 删除这个边之后图不连通
强联通:有向图中,两个点可以互相到达
强联通分量( SCC):有向图中,分量中所有点可以互相到达
点双联通分量:没有割点;
边双联通分量:没有割边;
1.1 最短路总结(较重要):
其实bfs解决最短路是没问题的,感觉bfs启发了最短路算法。
算法 | 数据规模 | 复杂度 | 数据结构 | 边权 | 用法 |
---|---|---|---|---|---|
floyd | 200 | O(n^3) | 邻接矩阵 | 有负 | 解决一些其他问题挺方便 |
spfa | >=1e7 | O(n*m) | 邻接表,前向星 | 有负 | 随机数据线性时间,网格图可以拉满复杂度,可判负边,比较好写 |
dijkstra | >=1e7 | O(m*log(n)) | 邻接表,前向星 | 无负 | 较快通用算法 |
1.2 差分约束:
解决一系列线性规划问题:
把x1,x2,等等,看做最短路节点,
跑一遍spfa,对于每一条边起点u,终点v,都有:
那么在求解最短路的时候,实际上是得到一组最大解(因为 若干个 = 的成立)。
求解最长路,得到的是一组最小解。
板题:poj3159
跑一遍spfa,前向星+模拟队列,不然TLE
1.3 拓扑图
做法:
按顺序跑一遍,可以bfs,dfs,个人喜欢bfs。
做法:找出入度为0的点,开始广搜。
用法:
-
判断有没有环:拓扑时记录出队人数,小于n必有环。
-
当拓扑队列里人数超过2时,说明有排名并列。
例题:
T123571 Misaka Network
按拓扑序选择,
记得当时犯了一个逻辑错误:一个点不是控制点,就是如果有控制点连到它就行了。
但,一个点是控制点,不是说连到它的点不是控制点就行了,只要有一个连到它的控制点,那它就不是控制点。
1.4 欧拉路(一笔画)
做法:
无向图:
第一步:判断是否联通,并查集解决;
第二步:
有向图:
第一步:判断是否联通,并查集解决;
第二步:记录出入度数
例题:
B - Grid with Arrows
网格图欧拉路,开不了数组,蛋疼的动态过不了,哈希处理
1.5 无向图求割点及割边
tarjan算法:
一张图搞成一颗dfs树;
low数组表示可到达祖先,dep表示递归深度;
如果 low[v]>=num[u],说明是割点;
如果 low[v]>num[u] 说明是割边;
如果 num[v]<num[u]&&v!=fa,说明是回退边,
求构成边连通分量的最小边:
运用缩点技术:
在dfs的时候,low值相同的点必然在一个边双联通分量里,把每一个双连通分量压缩成为一个点求解。
1.6 有向图求强联通分量
还是tarjan算法
有以下结论:
1.一个强联通分量的所有的可以互相访问,low值相同。
2.用栈保存节点(注意是边,而不是点),dfs撞到 low=dep的点 ,把栈里元素全抖出来,构成一个SCC。
1.7 最小生成树
贪心取边+并查集联通(较简单)复杂度(O(E log(E)+E))
1.8 二分图匹配(较重要)
几个结论:
如何判断一个图可以搞成二分图?
采用染色法,每两个相邻的点必然不在一个独立集里,把他们染成不同的颜色。
二分图等价于没有奇环的图
如果有奇环,染色染出来必然矛盾。
二分图匹配(匈牙利算法)
较简单,
点u,v可以匹配,当且仅当 u,v都还未匹配,或者u已经匹配的点可以换人匹配,最终使得u,v匹配。
写法:
bool findpath(int u){
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(!vis[v]){
vis[v]=1;
if(!match[v]||findpath(match[v])){
match[v]=u;
return 1;
}
}
}
return 0;
}
原文地址:https://www.cnblogs.com/littlerita/p/12557701.html
- Android i2c-tools移植
- 高通GPIO驱动(DTS方式)
- Dos烧录脚本
- 使用ServiceStack构建Web服务
- 《Redis设计与实现》读书笔记(二十三) ——Redis服务器初始化
- 警惕:Oracle中删除的分区不会进入回收站(Recyclebin)
- 《Redis设计与实现》读书笔记(二十五) ——Redis主从复制具体过程
- 基于input子系统的sensor驱动调试(一)
- 《Redis设计与实现》读书笔记(二十六) ——Redis哨兵(sentinel)启动与建立监听机制
- 《Redis设计与实现》读书笔记(二十七) ——Redis哨兵(sentinel)主服务器下线判断与故障转移
- 基于input子系统的sensor驱动调试(二)
- 编程语言中的闭包
- 《Redis设计与实现》读书笔记(二十八) ——Redis集群节点结构与槽分配
- Linux RCU 机制详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 技术角 | 解决ES SQL命令行启动报错 ./x-pack-env: No such file or directory
- Linux常用命令归类总结
- 潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞
- 对比MySQL,学会在Pandas中实现SQL的常用操作
- 【Python基础】科学计算库Scipy简易入门
- 【DL】规范化:你确定了解我吗?
- Python|让代码替你“说话”
- Markdown笔记Ⅰ
- 再见,AOP,怀恋和你在一起的日子!
- Markdown笔记Ⅱ
- 使用 Ink!开发 Substrate ERC20 智能合约
- Python|Numpy的常用操作
- 提速72倍,在Python里面调用Golang函数
- JUC学习之基础
- 【DB笔试面试841】在Oracle中,如何跟踪tnsping过程?