[OI笔记]基础图论/图算法
- [2017.8.29 00:00]——前几天开始好好学了几天的图论,不过这最近又突然因为一些原因(其实是晚上没睡好导致白天没精神)颓废了几天…一方面为了控制自己同时也可以当做之后noip前复习用的笔记,毕竟自学党的笔记只能这样子了吧。嗯,尽量写一些比较有用的东西以后自己方便复习也方便给新人看(我自己不还是新人么x),除了图算法其他一些内容之后学到也尽量开个博客记一下…嗯大概就这样
- 不定期更新
- 如有错误还请指出!
- 其实主要是留给自己用的,如果想要好好学的话还是去找比较具体的blog吧
想写的东西(大部分只留代码):
- 图的表示/储存/访问
- 强连通分量
- 求最小生成树的的两种算法(K开头的那啥Kruskal跟Prim)
- 单源最短路算法(Dij什么什么的和SPFA(Bellman-Ford队列优化))和多源最短路算法(Floyd)
- 图的割点
- 双联通分量(这个暂时还不会QAQ)
- 拓扑排序
- 欧拉路
- 网络流相关 (开玩笑我怎么可能会网络流QwQ)
- 一些基础的杂题
图的表示/储存/访问
- 参考文献:算法导论
(话说这部分会比较基础觉得没问题的可以直接跳下去)(目前下面还没有)
如果比较严格的,一般记图\(G\)为一个二元组\(G=(V,E)\),其中\(V\)为有限集,称为图\(G\)的顶点集,\(V\)中的元素称为顶点。称为图\(G\)的边集,其元素称为边。两个顶点相同的边称为自环。对于有向图来说\(E\)由\(V\)中两个元素构成的二元关系,而无向图的边集\(E\)则是由无序的顶点对构成的,而不是有序对。
(下面还是不要用这么“严格”的说法好了,如果想看严格的说法可以参考算法导论
比如下图是一个顶点集为\(V=\{1,2,3,4,5,6\}\)边集为\(E=\{(1,1),(1,2),(1,3),(1,4),(2,4),(5,6),(6,5)\}\)的有向图的栗子

QwQ啊感觉这些概念不太好讲我也表达不清楚…概念部分就这样先过了吧x想了解的还是查其他的资料吧~
下面还是说说储存吧QwQ
我常用(或者可以说是用过的)的大概就两种…邻接矩阵和链式前向星,我邻接表好像不怎么用…
邻接矩阵:用一个矩阵\(A\)存图的边,比如可以用\(A[u][v]\)表示图中从\(u\)到\(v\)的一条边,边权就直接存在表中,不存在边一般就直接设为\(0\),\(∞\)或者是一些特殊值(具体根据实际情况)。这种表示方法可以快速查找两个点之间是否有边,以及如果有那么这条边的边权是多少,但如果有重边的话可能不太好处理,空间复杂度是\(O(n^2)\)。(目前我好像除了写Floyd以外基本没有用邻接矩阵…
链式前向星:
我们建一个结构体来表示权值为weight的边\((u,v)\):struct edge{int v,weight,next;};
next表示这条边的下一条边的储存位置
\(u\)呢?往下看x
边集数组直接:edge Edges[M];
加边只要设一个全局变量比如cnt,表示当前到第几条边
一个head[]数组表示以i为起点第一条边的位置
然后加一条\(u\)到\(v\)的权值为\(w\)的边就直接:void addEdge(int u,int v,int w)
{
Edges[++cnt]=(edge){v,w,head[u]};
head[u]=cnt;
}
然后注意其实这样子head[i]实际上是输入的i为起点的最后一条边,也就是反过来的,不过这在大多数情况下并不会对结果造成影响。(嘛反正我是没遇到过)
如果需要遍历以cur为起点的所有边可以:
for(int i=head[cur];i;i=Edges[i].next)
{
//
}
这样Edges[i]就是当前这条边了,你可以对她做任何事情
然后这一部分大概就这样…
最后强调四点需要注意的:- 加边注意顺序不要错(不要像我一样把w放到next把head[u]放到w里面233)
- 无向图边集数组要开题目范围的两倍空间!
- 无向图边集数组要开题目范围的两倍空间!!
- 无向图边集数组要开题目范围的两倍空间!!!
强连通分量
大概就是有向图中如果任意两个点\(u\)和\(v\)互相可达,那么我们就称这个图为强连通图。有向图中一个极大的强连通子图就被称为强连通分量。
具体怎么求在这里不债述 (其实我也不怎么懂原理只会写模板)
有需要可以直接参考:BYVoid-有向图强连通分量的Tarjan算法
下面贴一下我平常的代码…大概长这样(临时打的不知道有没有打错…)
inline void tarjan(int i)
{
int j;
LOW[i]=DFN[i]=++Dindex;
stack[++s_top]=i;
inS[i]=1;
for(int cur=head[i];cur;cur=edges[cur].next)
{
j=edges[cur].to;
if(!DFN[j])
{
tarjan(j);
LOW[i]=min(LOW[i],LOW[j]);
}else if(inS[j])
LOW[i]=min(LOW[i],DFN[j]);
}
if(DFN[i]==LOW[i])
{
++cntscc;
do
{
j=stack[s_top]--;
inS[j]=0;
belong[j]=cntscc;
}while(i!=j);
}
}
(然后有没有人告诉我怎么证这个算法的正确性啊QAQ
丢一些模板先跑了x
因为开始正式上课了加上要准备开始学点新东西,剩下留着下次复习图论(如果有的话)再更吧
为了防止我老年痴呆症导致忘记怎么写一些模板…这里先贴几个模板(有空再来补充具体的说明)
如果有什么问题欢迎在评论区指出_(:з」∠)_
[OI笔记]基础图论/图算法的更多相关文章
- [OI笔记]杂题整理1(基础篇~)
算是开学第四周啦,之前的三周大概过了一遍基础图论和数学相关的内容.这篇随笔打算口胡一些近期做感觉比较好的数学相关的题目 因为这段时间主要是看紫书学的,所以其实会有些出自UVA的例题,如果需要题目但是觉 ...
- Day 4 学习笔记 各种图论
Day 4 学习笔记 各种图论 图是什么???? 不是我上传的图床上的那些垃圾解释... 一.图: 1.定义 由顶点和边组成的集合叫做图. 2.分类: 边如果是有向边,就是有向图:否则,就是无向图. ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- 小猪猪C++笔记基础篇(五)表达式、语句
小猪猪C++笔记基础篇(五) 关键词:表达式.语句 本章的内容比较简单,基本上没有什么理解上的困难,都是知识上的问题.先开始想要不要写呢,本来是不准备写的,但是既然读了书就要做笔记,还是写一写,毕竟还 ...
- 小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助
小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧 ...
- 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器
小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 《python基础教程(第二版)》学习笔记 基础部分(第1章)
<python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...
随机推荐
- 新鲜出炉!JAVA线程池精华篇深度讲解,看完你还怕面试被问到吗?
前言 前两天趁着假期在整理粉丝私信的时候看到一个粉丝朋友的私信跟我说自己现在正在复习准备面试,自己在复习到线程池这一块的时候有点卡壳,总感觉自己差了点什么.想要我帮他指导一下.这不趁着假期我也有时间我 ...
- Fruity Parametric EQ 2使用说明(一)——FL Studio插件教程
FL Studio插件教程-Fruity Parametric EQ 2使用说明(一) Fruity Parametric EQ 2均衡器,是一款我们在FL Studio制作音乐时经常会用到的插件,它 ...
- 视频剪辑软件Camtasia的快捷键大全
今天来给大家介绍一下Camtasia快捷键的相关内容,Camtasia也是一个十分好用的电脑屏幕录制与视频剪辑制作软件了,可能有些朋友用过,毕竟它在视频录制与制作上确实比较好用. 首先在菜单栏中点击& ...
- leetcode117. 填充每个节点的下一个右侧节点指针 II
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...
- laradock使用问题汇总
laradock简介 一套完整的基于Docker的PHP开发环境.包含了预先打包的Docker镜像,所有预先配置都是为了提供一个完美的PHP开发环境(中文文档).PS: 不是最新版的 windows1 ...
- 【初等数论】裴蜀定理&扩展欧几里得算法
裴蜀定理: 对于\(a,b\in N^*, x, y\in Z\),方程\(ax+by=k\)当且仅当\(gcd(a, b)|k\)时有解. 证明: 必要性显然. 充分性:只需证明当\(k=gcd(a ...
- odoo13之右上角弹出提示框
前言 在odoo中已经提供好了右上角弹出提示框的接口,我们只需要调用即可: 而提示框的实现又分为前端js实现和后段函数实现,前后端实现的效果相同. 实现效果图 前端实现提示框 在前端中显示提示框最常用 ...
- 《高并发下的.NET》第2季 - 故障公告:高并发下全线崩溃
大家好,非常抱歉,在昨天下午(12月3日)的访问高峰,园子迎来更高的并发,在这样的高并发下,突发的数据库连接故障造成博客站点全线崩溃,由此给您带来很大的麻烦,请您谅解. 最近,我们一边在忙于AWS合作 ...
- 微信小程序里如何使用npm?小程序集成友盟举例
1.执行npm初始化指令 小程序根目录,命令执行如下指令: npm init 执行后会让加载项目初始信息,具体截图如下: 2.执行安装npm包指令 在这我们举个例子,以接入友盟统计SDK为例,执行命令 ...
- JZOJ8月6日提高组反思
JZOJ8月6日提高组反思 又是愉快的没落的一天 被2020&2018暴打day2 一堆人AK-- T1 看到这个\(m\)只有100 就坚定了我打暴力的信心 离散化加暴力匹配 原本就想\(3 ...