`
dogasshole
  • 浏览: 842058 次
文章分类
社区版块
存档分类
最新评论

图论简介

 
阅读更多
图论小结

1 拓扑排序:复杂度o(n+m)
普通的拓扑排序没什么好说的,在一些特殊结构的拓扑图上(比如自动机,度有限制的图或树),结合最小表示法(我一般都是并查集+map)可以判图的同构

推荐题:Poj3687 Uvalive3981 Ural1872

2 最短路 :
a) bfs: 复杂度o(n+m),适用于边权为1的图
b) 扩展bfs : 复杂度o(n+m),适用于边权为1或者0的图
算法实现:设一个0~N的桶,桶内装有已知最短路径长度的节点。一开始只有桶0中存有起点S。同时设一个指针p,初始时p指向0号桶。接着分N个阶段扩展,每一个阶段中,依次挑出桶(p-1)中的点扩展 :扩展只用权为1的边;在这之后依次挑出桶p中的点扩展:扩展只用权值为0的边。在执行完这些扩展后,将p加1。由于最短路径长度不会超过N,因此最多扩展到第N个阶段就可以结束算法了。
c) Dijkstra : 复杂度o(n^2+m) 加堆优化后为 o(n+mlogn) 适用于边权非负的图
d) Bellman: 复杂度o(nm) 除了复杂度稍微高了点,几乎是一个完美的算法,好写,无边权要求,可测负环
e) Spfa: 复杂度我也算不出来,有负环的情况下会退化为bellman的复杂度,竞赛时最常用的就是这货…
f) 栈优化的spfa: 复杂度不明,测负环时奇快(如果要写消负环的费用流,非此子莫属了)具体算法实现参照红薯的模板或者2009姜碧野的论文
g) Floyd: 复杂度o(n^3),可动态添边和查询任意点对之间的最短路(或者传递闭包),代码实现出奇地简洁

最短路问题是很多图论问题的基础,如果存在一条边权为w的有向边u->v,则最短路网络上满足dv<=du+w,一般根据这个三角不等式构图即可

推荐题:
Hdu3873 Poj1062 Ural1325 Hdu4096 Poj1275 Poj2949



3 生成树:
a) Prim: 和Dijkstra几乎是一样的,不累述
b) Kruskal: 复杂度o(n+mlogm),要用到并查集,把边按权值排序,依次检查每条边,看两个点是否在同一个联通块里,不是的话就把这条边选了,然后合并两个联通块,代码实现非常简单,我一般都用这个
c) 次小生成树:复杂度o(n^2)这个问题本身没有什么意义,不过其算法实现的思想很值得借鉴,先把最小生成树建好,然后预处理出任意两点之间的最大边权,依次把每条非树边当做一组查询,假设加上这条非树边,要删掉的肯定是对应两个点之间的权值最大的边,然后看看这个边权和增量是多少~
d) 度限制的最小生成树 :个人觉得可以无视,有兴趣的话可以参考汪汀ppt(写得挺清楚的)或者黑书
e) 生成树维护: 动态地加边删边,然后动态地查询一些问题,维护n-1条边,然后每次o(n)地回答查询或者修改操作,总复杂度o(n*q),q为操作数
f) 树形图: 传说那叫刘朱算法?o(n*m)

推荐题:
Poj2421 Poj2728 Poj3522 Hdu4081 ZOJ 3509 Poj 2838 Hdu2121

4 网络流:
这是图论里比较难缠的一块,想得到的时候觉得是水题,否则就觉得是神题…
a) 最大流:建议先把最基本的EK学好,完全理解了再去学sap
技巧:
拆点,在点与点之间的边限制容量,这样可以限制流过某些点的流量
二分参数,然后根据参数构图,再判是否能满流(某些这种题其实动态加边,用EK增广会更快,也更好写...)
最小割构图,定义及构造推荐amber的论文,最大权闭合图推荐2010年林衍凯的论文(暂时见到的讲得最好的~)

b) 费用流:一般直接spfa然后增广都没问题,实在卡得紧的话就每次spfa后多路增广,如果这都TLE的话,那只能说明构图不优越…
强烈推荐《网络流:理论、算法与应用》application里的例题讲解
c) 上下界网络流: 简单二分做法参照周源论文,复杂的不会

推荐题:
Uvalive4259 Uvalive4268 Poj1815 Poj1149 Poj2987 Poj2391 Poj1637 Poj2699 Poj3155
Hdu3657 Zoj2857 Poj2156 Poj3422 Poj3680 Hdu3947 Hdu4106

5 匹配:
a) 二分图基数匹配:匈牙利算法,我写的复杂度是o(n*(n+m))的,不过一般都跑不满。

如果喜欢敲最大流的话也可以~

相关模型:最小路径覆盖,多重匹配,最小点覆盖

相关优化:

有些二分图其中一边的点数很少,另一边的点数很多,从点数多的一边开始搜匹配方案很可能会TLE,
解决方法是从点集很少的一边去搜

题目给出的图的数据没有分好两个点集,但通过一些条件可以证明这是个二分图,这时候如果去写一个BFS(或者DFS)染色的再跑匈牙利算法的话,代码量略显大了些。
解决方法:不染色直接跑匈牙利,从每个未被匹配的点开始搜增广路,记录方案时要双向记录,整个匈牙利过程的代码基本加一两句代码就够了

b) 二分图最大权匹配:虽然说可以用费用流去写,如果想认真搞ACM的话建议还是把KM搞懂,尤其是其顶标的含义,顺带吐槽一句,我还不明白为啥大家都说km是o(n^3)的,我自己算出来的复杂度是o(n^4),但一般都跑得飞快
推荐资料:http://cuitianyi.com/blog/%E6%B1%82%E6%9C%80%E5%A4%A7%E6%9D%83%E4%BA%8C%E5%88%86%E5%8C%B9%E9%85%8D%E7%9A%84km%E7%AE%97%E6%B3%95/
某些题目,要求du+dv>=wuv(或者du+dv<=wuv),且u和v分属于不同的两个集合(即二分图),求sum(d)的最值,则直接跑km,最后的顶标数字就是一组最优解

c) 一般图基数匹配:有兴趣的话去学学带花树,赛场上我是写不出来这玩意~

d) 一般图加权匹配:参考杨大牛的随机调整算法

推荐题:Poj3041 Poj2289 Hdu3861 Hdu2828 Hdu3729 Uva11985 Poj2195 Poj3686
Zoj2342 Cdoj1450 Ural1099 Zoj3316 Uvalive4039

6 DFS相关:(这部分是我在图论问题中最喜欢的模块,膜拜tarjan中…)
a) 时间戳:在一个联通块里,DFS树中每个节点进栈和出栈的时间,强连通和双联通问题以及判断某个点是否在某棵子树内都要用到这个,如果把进出时间当做左右括号的话,还能处理很多静态的树上的统计和最值问题
b) Lca:离线的用并查集处理便可,在线的在DFS过程中处理出一个倍增数组(这个还能处理出树链区间上的最值)
c) 树的重心,某些题目利用树的重心的某些性质设计算法会好写很多
d) 有向图强连通分量: Kosaraju和tarjan,注意前者结束后也自动拓扑排好序了
2-sat问题每个点都恰好是两种可能状态中的一种,然后会有一些限制,比如u为状态1的话v就必须为状态0,问是否存在满足条件的解,有时候要求构造出来
具体做法请参考伍煜或者赵爽的论文,如果要构造解的话建议用Kosaraju
e) 双联通分量,割点:注意双联通分量是边集,不是点集…另外,一个桥边也是一个双联通分量~
很多人写的时候是把边压栈的,我个人习惯是给边集开一个并查集,然后直接把属于同一个环上的边合并,这种题常常需要二次构图,第二次构图时把原来的边集和割点当成新图中的点,有关系的连边,然后做一次预处理根据LCA回答相关查询
f) 仙人掌图:点数等于边数的一般都是水题(建议去研究研究cf81e那题watashi的做法),还有一类仙人掌图,每条边最多在一个环内,这种题型的做法是,树形DP,遇到桥则正常转移,否则在时间戳最小的点把环上的信息压到该点上


推荐题:
Hdu3804 Poj3417 Foj1703 Ural1752 Uvalive3713 Hdu4115 Poj2942 Hdu3686 Hdu3896 Uvalive5135 Spoj Roman Roads
Cf97e Ural1557 Hdu3057 Poj3567 Cdoj1469 Cf81e Srm345 1000 Cf48g sgu487


玩图论的,最好不要做太多模板题,学新算法的时候理解为主,很多看起来不可能在赛场上碰到的算法,有兴趣的话还是建议去学一下,很可能下次遇到一个其他问题但可以用这种算法实现中体现的思想去构思设计新算法~
分享到:
评论

相关推荐

    计算机毕业设计-校园教务处管理系统.zip

    计算机毕业设计中的校园教务处管理系统是一个旨在提高校园教务管理效率和质量的综合性信息平台。该系统采用SSM(Spring、SpringMVC、MyBatis)技术栈进行构建,利用Spring框架进行业务逻辑处理和依赖注入,通过SpringMVC实现模型-视图-控制器的设计模式,以及使用MyBatis作为ORM工具进行数据库持久化操作。系统功能涵盖了学生信息管理、课程安排、成绩录入与查询、教室资源分配、考试管理、教师工作量统计等关键模块,通过提供一个用户友好的界面和强大的后台管理功能,校园教务处管理系统不仅优化了教务工作流程,还提升了学生和教师的互动体验,是计算机专业学生展示其系统分析、设计和开发能力的理想项目。

    一些关于创新创意类的电赛竞赛文档.zip

    一些关于创新创意类的电赛竞赛文档

    项目计划管理任务app应用界面xd源文件(1)AdobeXD源码下载设计素材UI设计.xd

    项目计划管理任务app应用界面xd源文件(1)AdobeXD源码下载设计素材UI设计

    电子商务公共服务平台大数据中心HTML模板源码 大数据大屏展示源码 VUE.zip

    电子商务公共服务平台大数据中心HTML模板源码 大数据大屏展示源码 VUE

    suno AI专业教程:深入探索与实践

    本资源是一份专为AI技术追求者量身定制的深度学习与suno AI实战教程,以精炼的内容和实战案例为核心,旨在帮助专业人士和学习者快速掌握suno AI的关键技术和应用。它适用于希望深化AI知识的研究学者、工程师、数据科学家以及充满热情的学生和独立研究者。通过本教程,学习者将能够作为教学辅助材料系统学习AI理论与实践,或在职业发展中通过持续学习提升专业技能。此外,本资源通过案例分析激发创新思维,指导学习者将suno AI技术应用于解决现实问题,同时提供额外的学习材料和工具,如在线模拟和代码示例,以支持深入学习和实践探索。内容丰富而不冗长,每个知识点都配有实例分析,确保学习者能够快速吸收和应用,定期更新以紧跟技术发展,是提升AI技术能力的理想选择。

    中科创达部门技术大赛.zip

    中科创达部门技术大赛

    报文响应+获取会话公钥(SessionKey)+RAS加密+AES加密+MD5加密

    1、接入申请:在接入单位应先向税务局申请,经过审批备案后,将生成的唯一的接入方编号(appCode)和通过使用OpenSSL生成的一对私钥和公钥。其中,私钥由税务局保留,接入方编号(appCode)和公钥分配给申请接入单位,接入单位应妥善保管公钥。 2、会话公钥申请 接入申请通过后,将分配得到的接入方编号(appCode)按“请求参数结构”中的规范调用“申请会话公钥”接口,调用接口成功后得到的会话公钥(publicKey),可调用其他业务接口使用。接入方单位应妥善管理会话公钥,注意保密。 3、接口调用 调用非会话公钥申请接口时,取得的会话公钥可对请求报文进行AES加密,加签;也可对返回报文进行解密,验签。 4、调用申请会话公钥接口时,用分配的公钥对requestData明文进行RSA加密,sigin为空即可。调用非申请会话公钥接口时,用会话公钥对requestData明文进行AES加密;再对(requestData密文+会话公钥明文)进行MD5加密作为sign值。

    Navigations Widgets for Web UI Kit 源码下载设计素材UI设计.xd

    25 Navigations Widgets for Web UI Kit Ver-01AdobeXD源码下载设计素材UI设计

    W801学习笔记十二:掌机进阶V3版本之驱动(PSRAM/SD卡)

    w801掌机完整代码。

    学‘四史’、正青春、颂祖国”华中师范大学 第十届大学生新媒体创意大赛.zip

    学‘四史’、正青春、颂祖国”华中师范大学 第十届大学生新媒体创意大赛

    高分课程设计 QT5.7+Sqllite数据库小系统源码+部署文档+全部数据资料

    【资源说明】 高分课程设计 QT5.7+Sqllite数据库小系统源码+部署文档+全部数据资料 可实现数据库的可视化操作:增、删、改、查.zip 【备注】 1、该项目是高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11/linux测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    试用Dev Containers的示例项目-Go

    计算机技术是指评价计算机系统的各种知识和技能的总称。它涵盖了计算机硬件、软件、网络和信息安全等方面。计算机技术的发展使我们能够进行高效的数据处理、信息存储和传输。现代计算机技术包括操作系统、数据库管理、编程语言、算法设计等。同时,人工智能、云计算和大数据等新兴技术也在不断推动计算机技术的进步。计算机技术的应用广泛,涵盖了各个领域,如商业、医疗、教育和娱乐等。随着计算机技术的不断革新,我们可以更加高效地实现预期自动化、标准化

    设计模式_结构型_装饰者模式.md

    设计模式_结构型_装饰者模式

    高分毕业设计 基于Python爬虫+Flask的现岗位推荐分析可视化系统源码+部署文档+全部数据资料

    【资源说明】 高分毕业设计 基于Python爬虫+Flask的现岗位推荐分析可视化系统源码+部署文档+全部数据资料 实现工作岗位的实时发现,推荐检索,快速更新以及工作类型的区域分布效果,关键词占比分析等 【备注】 1、该项目是高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11/linux测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    25考研大礼包,包括数学备考资料,英语备考资料,英语阅读资料,政治备考资料

    25考研大礼包,包括数学备考资料,英语备考资料,英语阅读资料,政治备考资料

    听下plus-v2.0.2.apk

    听下plus-v2.0.2.apk

    生物信息学课程学习笔记第四版2022版

    生物信息学课程学习笔记第四版2022版

    这是一个使用pytorch完成DCGAN生成动漫人物图像的机器学习代码.zip

    这是一个使用pytorch完成DCGAN生成动漫人物图像的机器学习代码

    0016数字计数器动画AdobeXD源码下载设计素材UI设计.xd

    0016数字计数器动画AdobeXD源码下载设计素材UI设计

    一个用谷歌机器学习算法识别人体姿势并用来控制GTA:SA鹞式战斗机飞行的代码.zip

    一个用谷歌机器学习算法识别人体姿势并用来控制GTA:SA鹞式战斗机飞行的代码

Global site tag (gtag.js) - Google Analytics