环的寻找:寻找无向图中所有存在的环-删除点法

        此文讨论一个无向图中存在环的问题,在不管多复杂的连通图中寻找出所有的环,使用删除点的方法。

        此外,这个版本的查找方法可以用于其他场景:找出无向图中所有的环的算法             

        结果能找到最小的环,或许要靠运气,输出该输出的环抓狂...............,这是原始算法。


改进:

可以输出最大环(通过跳过多度点),可以输出最小子环(通过使用最短路径)......................

        使用一个图:

       

        比如在上图中,存在多个环(1,2,3,4,5,6)(6,7,8,9)(1,2,5,6)(1,2,3,5,6).........

        怎么寻找呢?


一、使用删除边法

        本例中,从顶点9开始,构建DFS

        1.首先删除所有度数为1的点,这样点14就被删除。这样只剩下多度顶点的环

          


        2. 若从顶点9开始,找到了环(9,8,6,7),对于顶点8和顶点7,其所有链接的边都在当前环上,则可以删除掉两个顶点;

         而9除了处于环中的边,还有其他边,则不能删除。此外,顶点6也不能删除。

         判断条件: 若顶点X链接的边在这一个环上,则可以删除此顶点。

             

                 例如:在图中,删除的点为7和8,同时所有的链接边也删除。输出环(9.8.7.6)。


        3. 使用堆栈,再次查找10,可以输出环(10,11,12,13),同时可以删除顶点(11,12,13)。此时顶点10 的度置位1,标识为已遍历状态。

                

        4.每次查找环,都删除度为1的节点和连接边。此时可以删除10,9,树退化为一颗子树。

                 


    5.到了一个查找重复环的时候   

         5.1. 此时没有单度节点,

         5.2. 出现问题,得重新考虑了!!!

        从顶点6开始找到所有的环:注意此过程依然为生成树的过程,每一个边都被设定为有向边。

       

   Code :

   

	// 寻找联通集合的闭包,判断是否连通,返回闭包
	public static void findSub(Boolean adjM[][], Set<Integer> votex, ArrayList<Set<Integer>> loopSets) {
		if (votex.size() < 2) {// 治标不治本
			return;
		}

		for (int m = 0; m < adjM.length;++m){
			adjM[m][m] =false;
		}
		
		// 计算顶点的度
		Integer[] degrees = new Integer[adjM.length];
		degrees = calVotexDegree(adjM);

		//循环查找,找到所有的度不为1的闭包
		boolean isdeleted = true;
		while( isdeleted ){
			isdeleted = false;
			degrees = calVotexDegree(adjM);
			delete1Degree(adjM, degrees);// 删除度数为1 的边

                         int l1 = votex.size();
			// 更新联通集合
			for (int i = 0; i < degrees.length; ++i) {
				if (degrees[i] == 0) {
					votex.remove(i);
					for (int m = 0; m < adjM.length;++m){
						adjM[i][m] = false;//更新度,若被移除则相关的邻接都置为false
						adjM[m][i] = false;
					}
				}
			}
			int l2 = votex.size();
			if(l1!=l2) isdeleted = true;
		}
		
		// 遍历所有节点,逐个取出,去除非环节点
		Set<Integer> loop = new HashSet<Integer>();
		Set<Integer> sub = new HashSet<Integer>();
		boolean isBlankX = false;
		boolean isFind = false;

		for (int ob : votex) {
			int obj = ob;
			sub.add(obj);
			int idx = obj;
			for (int j = idx; j < adjM[idx].length;) {
				if (adjM[idx][j]) {
					if (sub.contains(j) && idx != j) {
						transSet(sub, loop);// 若已存在元素,则存在环,复制出环
						loopSets.add(loop);
						votex.removeAll(loop);
						sub.clear();
						findSub(adjM, votex, loopSets);
						isFind = true;
						if (votex.size() < 3) {// 剩余两个就不再寻找
							isBlankX = true;
						}
						++j;
					} else {
						sub.add(j);
						++j;
					}
				} else
					++j;
			}
			if (isFind)
				break;
		}
		return;
	}

// 输出顶点的度
	public static Integer[] calVotexDegree(Boolean adjM[][]) {
		Integer[] degrees = new Integer[adjM.length];
		for (int i = 0; i < adjM.length; ++i) {
			degrees[i] = 0;
			for (int j = 0; j < adjM[i].length; ++j) {
				if (adjM[i][j] == true) {
					degrees[i] = degrees[i] + 1;
				}
			}
		}
		return degrees;
	}

// 更新矩阵:删除权值为1和0的边
	public static void delete1Degree(Boolean[][] adjM, Integer[] degrees) {
		for (int j = 0; j < adjM.length; ++j) {
			adjM[j][j] = false;// 自身边消除掉
			if (degrees[j] < 2) {
				for (int k = 0; k < adjM[j].length; ++k) {
					adjM[j][k] = false;
					adjM[k][j] = false;
				}
				degrees[j] = 0;
			}
		}
	}

输出结果:输出结果具有一定的概率性,和顶点的排序有关。



  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
# 国家集训队论文列表(1999-2019) ___点击目录快速跳转:___ - _国家集训队论文列表(1999-2019)_ * [_1999_](#1999) * [_2000_](#2000) * [_2001_](#2001) * [_2002_](#2002) * [_2003_](#2003) * [_2004_](#2004) * [_2005_](#2005) * [_2006_](#2006) * [_2007_](#2007) * [_2008_](#2008) * [_2009_](#2009) * _2010~2012:组委会暂停论文答辩项目_ * [_2013_](#2013) * [_2014_](#2014) * [_2015_](#2015) * [_2016_](#2016) * [_2017_](#2017) * [_2018_](#2018) * [_2019_](#2019) - _论文分类汇总(1999-2009)_ * [组合数学](#组合数学) + [计数与统计](#计数与统计) + [数位问题](#数位问题) + [动态统计](#动态统计) + [博弈](#博弈) + [母函数](#母函数) + [拟阵](#拟阵) + [线性规划](#线性规划) + [置换群](#置换群) + [问答交互](#问答交互) + [猜数问题](#猜数问题) * [数据结构](#数据结构) + [数据结构](#数据结构-1) + [结构联合](#结构联合) + [块状链表](#块状链表) + [动态树](#动态树) + [左偏树](#左偏树) + [跳表](#跳表) + [SBT](#sbt) + [线段树](#线段树) + [单调队列](#单调队列) + [哈希表](#哈希表) + [Splay](#splay) * [图论](#图论) + [图论](#图论-1) + [模型建立](#模型建立) + [网络流](#网络流) + [最短路](#最短路) + [欧拉路](#欧拉路) + [差分约束系统](#差分约束系统) + [平面图](#平面图) + [2-SAT](#2-sat) + [最小生成树](#最小生成树) + [二分图](#二分图) + [Voronoi图](#voronoi图) + [偶图](#偶图) * [树](#树) + [树](#树-1) + [路径问题](#路径问题) + [最近公共祖先](#最近公共祖先) + [划分问题](#划分问题) * [数论](#数论) + [欧几里得算法](#欧几里得算法) + [同余方程](#同余方程) * [搜索](#搜索) + [搜索](#搜索-1) + [启发式](#启发式) + [优化](#优化) * [背包问题](#背包问题) * [匹配](#匹配) * [概率](#概率) + [概率](#概率-1) + [数学期望](#数学期望) * [字符串](#字符串) + [字符串](#字符串-1) + [多串匹配](#多串匹配) + [后缀数组](#后缀数组) + [字符串匹配](#字符串匹配) * [动态规划](#动态规划) + [动态规划](#动态规划-1) + [状态压缩](#状态压缩) + [状态设计](#状态设计) + [树形DP](#树形dp) + [优化](#优化-1) * [计算几何](#计算几何) + [立体几何](#立体几何) + [计算几何思想](#计算几何思想) + [圆](#圆) + [半平面交](#半平面交) * [矩阵](#矩阵) + [矩阵](#矩阵-1) + [高斯消元](#高斯消元) * [数学方法](#数学方法) + [数学思想](#数学思想) + [数学归纳法](#数学归纳法) + [多项式](#多项式) + [数形结合](#数形结合) + [黄金分割](#黄金分割) * [其他算法](#其他算法) + [遗传算法](#遗传算法) + [信息论](#信息论) + [染色与构造](#染色与构造) * [一类问题](#一类问题) + [区间](#区间) + [序](#序) + [系](#系) + [物理问题](#物理问题) + [编码与译码](#编码与译码) + [对策问题](#对策问题) * [优化](#优化-2) + [算法优化](#算法优化) + [程序优化](#程序优化) + [语言](#语言) * [策略](#策略) + [策略](#策略-1) + [倍增](#倍增) + [二分](#二分) + [调整](#调整) + [随机化](#随机化) + [非完美算法](#非完美算法) + [提交答案题](#提交答案题) + [守恒思想](#守恒思想) + [极限法](#极限法) + [贪心](#贪心) + [压缩法](#压缩法) + [逆向思维](#逆向思维) + [穷举](#穷举) + [目标转换](#目标转换) + [类比](#类比) + [分割与合并](#分割与合并) + [平衡思想](#平衡思想) Table of contents generated with markdown-toc --- ## 1999 陈 宏 -《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》 来煜坤 -《把握本质,灵活运用——动态规划的深入探讨》 齐 鑫 -《搜索方法的剪枝优化》 邵 铮 -《数学模型的建立、比较和应用》 石润婷 -《隐蔽化、多维化、开放化──论当今信息学竞赛数学建模的灵活性》 杨 帆 -《准确性、全面性、美观性——测试数据设计的三要素》 周咏基 -《论随机化算法的原理与设计》 ## 2000 陈 彧 《信息学竞赛的思维方法》 方 奇 《动态规划》 高寒蕊 -《递推关系的建立及在信息学竞赛的应用》 郭 一 -《数学模型及其在信息学竞赛的应用》 江 鹏 -《探索构造法解题模式》 李 刚 -《动态规划的深入讨论》 龙 翀 -《解决空间规模问题的几种常用的存储结构》 骆 骥 -《数学模型的建立和选择》 施 遥 -《人工智能在围棋程序的应用》 肖 洲 -《数据结构的在程序设计的应用》 谢 婧 -《规模化问题的解题策略》 徐 串 -《论程序的调试技巧》 徐 静 -《图论模型的建立与转化》 杨江明 -《论数学策略在信息学问题的应用》 杨 培 -《非最优化算法初探》 张 辰 -《动态规划的特点及其应用》 张 力 -《类比思想在解题的应用》 张一飞 -《冗繁削尽留清瘦——浅谈信息的充分利用》 ## 2001 高寒蕊 -《从圆桌问题谈数据结构的综合运用》 符文杰 -《Pólya原理及其应用》 高 岳 -《等硬度解题报告》 江 鹏 -《从一道题目的解法试谈网络流的构造与算法》 刘汝佳 -《搬运工问题的启示》 李益明 -《计算几何的相关问题》 李 源 -《树的枚举》 骆 骥 -《由"汽车问题"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退一步海阔天空——"目标转化思想"的若干应用》 方 奇 -《浅谈必要条件的应用》 符文杰 -《排序网络》 何江舟 -《用高斯消元法解线性方程组》 何 林 -《猜想及其应用》 黄 芸 -《POI0110 跳舞蝇》 金 恺 -《浅谈网络流算法的应用》 李澎煦 -《半平面交的算法及其应用》 李 睿 -《二分法与统计问题》 骆 骥 -《浅析解 "对策问题" 的两种思路——从《取石子》问题谈起》 孙方成 -《偶图的算法及应用》 孙林春 -《让我们做得更好——从《Parity》的解法谈程序的优化》 王知昆 -《搜索顺序的选择》 许智磊 -《二分,再二分!――从Mobiles(IOI 2001)一题看多重二分》 杨旻旻 -《构造法——解题的最短路径》 张家琳 -《多项式乘法》 张 宁 -《遗传算法的特点及其应用》 张一飞 -《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 周文超 -《树结构在程序设计的运用》 ## 2003 方 奇 -《染色法和构造法在棋盘上的应用》 高正宇 -《答案只有一个——浅谈问答式交互问题》 何 林 -《一类称球问题的解法》 侯启明 -《信息论在信息学竞赛的简单应用》 姜尚仆 -《模线性方程的应用——用数论方法解决整数问题》 金 恺 -《探寻深度优先搜索的优化技巧——从正方形剖分问题谈起》 雷 -《结果提交类问题》 林希德 -《求最大重复子串》 刘才良 -《平面图在信息学的应用》 刘一鸣 -《一类搜索的优化思想——数据有序化》 陆可昱 -《长方体体积并》 饶向荣 -《病毒的DNA——剖析一道字符匹配问题解析过程》 邵烜程 -《数学思想助你一臂之力》 王知昆 -《浅谈用极大化思想解决最大子矩形问题》 伍 昱 -《由对称性解2-SAT问题》 项荣璟 -《充分利用问题性质——例析动态规划的"个性化"优化》 许智磊 -《浅谈补集转化思想在统计问题的应用》 张 宁 -《猜数问题的研究》 张云亮 -《论对算法的选择》 周 源 -《浅析"最小表示法"思想在字符串循同构问题的应用》 ## 2004 何 林 -《信息学守恒法的应用》 胡伟栋 -《减少冗余与算法优化》 金 恺 -《极限法——解决几何最优化问题的捷径》 李锐喆 -《细节——不可忽视的要素》 鬲 融 -《浅谈特殊穷举思想的应用》 周 源 -《浅谈数形结合思想在信息学竞赛的应用》 朱晨光 -《优化,再优化!》 肖 天 -《"分层图思想"及其在信息学竞赛的应用》 汪 汀 -《最小生成树问题的拓展》 吴景岳 -《最小生成树算法及其应用》 栗 师 -《转化目标在解题的应用》 薛 矛 -《解决动态统计问题的两把利刃》 黄源河 -《浅谈图论模型的建立与应用》 楼天城 -《匹配算法在搜索问题的应用》 贝小辉 -《浅析树的划分问题》 林 涛 -《线段树的应用》 杨思雨 -《伸展树的基本操作与应用》 许智磊 -《后缀数组》 朱泽园 -《多串匹配算法及其启示》 韩文弢 -《论C++语言在信息学竞赛的应用》 ## 2005 龙 凡 -《序的应用》 魏 冉 -《浅谈“跳跃表”的相关操作及其应用》 任 恺 -《图论的基本思想及方法》 杨 俊 -《二分策略在信息学竞赛的应用》 张伟达 -《用改进算法的思想解决规模维数增大的问题》 黄 刚 -《数据结构的联合》 杨 弋 -《从“小H的小屋”的解法谈算法的优化》 朱晨光 -《浅析倍增思想在信息学竞赛的应用》 李羽修 -《Hash函数的设计优化》 王 俊 -《浅析二分图匹配在信息学竞赛的应用》 唐文斌 -《正难则反——浅谈逆向思维在解题的应用》 黄源河 -《左偏树的特点及其应用》 钱自强 -《遗传算法应用的分析与研究》 杨思雨 -《浅谈“黄金分割”和信息学的联系》 潘震皓 -《置换群快速幂运算研究与探讨》 胡伟栋 -《非完美算法在信息学竞赛的应用》 何 林 -《数据关系的简化》 汪 汀 -《参数搜索的应用》 周 源 -《浅谈信息学竞赛的“压缩法”》 朱泽园 -《回到起点 ----《一种突破性思维》 ## 2006 陈启峰 -《“约制、放宽”方法在解题的应用》 陈首元 -《维护森林连通性——动态树》 冯 威 -《数与图的完美结合——浅析差分约束系统》 高逸涵 -《对于一道题目的深入分析》 胡伟栋 -《演讲的若干建议》 黄劲松 -《贪婪的动态规划》 黄晓愉 -《深度优先搜索问题的优化技巧》 贾 由 -《由图论算法浅析算法优化》 李天翼 -《从特殊情况考虑》 龙 凡 -《一类猜数问题的研究》 汤 泽 -《浅析队列在一类单调性问题的应用》 唐文斌 -《“调整”思想在信息学的应用》 汪 晔 -《信息学的参考系与坐标系》 王 栋 -《浅析平面Voronoi图的构造及应用》 王 赟 -《Trie图的构建、活用与改进》 余远铭 -《最短路算法及其应用》 俞 鑫 -《棋盘的棋盘——浅谈棋盘的分割思想》 周戈林 -《浅谈类比思想》 周以苏 -《论反汇编在时间常数优化的应用》 朱晨光 -《基本数据结构在信息学竞赛的应用》 朱泽园 -《半平面交的新算法及其实用价值》 ## 2007 高逸涵 -《与圆有关的离散化》 王晓珂 -《解析一类组合游戏》 仇荣琦 -《欧拉回路性质与应用探究》 余江伟 -《如何解决动态统计问题》 杨 沐 -《浅析信息学的“分”与“合”》 李宇骞 -《浅谈信息学竞赛的线性规划——简洁高效的单纯形法实现与应用》 袁昕颢 -《动态树及其应用》 杨 哲 -《凸完全单调性的加强与应用》 王欣上 -《浅谈基于分层思想的网络流算法》 陈启峰 -《Size Balanced Tree》 杨 弋 -《Hash在信息学竞赛的一类应用》 古 楠 -《平面嵌入》 郭华阳 -《RMQ与LCA问题》 刘雨辰 -《对拟阵的初步研究》 陈 雪 -《问题的变与不变》 何 森 -《浅谈数据的合理组织》 胡伯涛 -《最小割模型在信息学竞赛的应用》 陈瑜希 -《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》 周 冬 -《生成树的计数及其应用》 刘家骅 -《浅谈随机化在信息学竞赛的应用》 ## 2008 曹钦翔 -《数据结构的提炼与压缩》 郑 暾 -《平衡规划——浅析一类平衡思想的应用》 刘 弈 -《浅谈信息学状态的合理设计与应用》 顾 研 -《浅谈随机化思想在几何问题的应用》 周梦宇 -《码之道——浅谈信息学竞赛的编码与译码问题》 肖汉骏 -《例谈信息学竞赛分析的“深”与“广”》 方 戈 -《浅析信息学竞赛一类与物理有关的问题》 吕子鉷 -《浅谈最短径路问题的分层思想》 周小博 -《浅谈信息学竞赛的区间问题》 俞华程 -《矩阵乘法在信息学的应用》 程芃祺 -《计算几何的二分思想》 高逸涵 -《部分贪心思想在信息学竞赛的应用》 **陈丹琦 -《基于连通性状态压缩的动态规划问题》** 张煜承 -《一类算法复合的方法》 陈瑜希 -《Pólya计数法的应用》 余林韵 -《运用化归思想解决信息学的数列问题》 任一恒 -《非完美算法初探》 高亦陶 -《从立体几何问题看降低编程复杂度》 **苏 煜 -《对块状链表的一点研究》** 周 冬 -《两极相通——浅析最大—最小定理在信息学竞赛的应用》 ## 2009 武 森 -《浅谈信息学竞赛的“0”和“1”》 **贾志豪 -《组合游戏略述——浅谈SG游戏的若干拓展及变形》** 徐持衡 -《浅谈几类背包题》 骆可强 -《论程序底层优化的一些方法与技巧》 刘 聪 -《浅谈数位类统计问题》 **李骥扬 -《线段跳表——跳表的一个拓展》** 汤可因 -《浅析竞赛一类数学期望问题的解决方法》 徐源盛 -《对一类动态规划问题的研究》 张昆玮 -《数学归纳法与解题之道》 漆子超 -《分治算法在树的路径问题的应用》 罗穗骞 -《后缀数组——处理字符串的有力工具》 **方展鹏 -《浅谈如何解决不平等博弈问题》** 姜碧野 -《SPFA算法的优化及应用》 **毛杰明 -《母函数的性质及应用》** 董华星 -《浅析字母树在信息学竞赛的应用》 梅诗珂 -《信息学竞赛概率问题求解初探》 高逸涵 -《数位计数问题解法研究》 周而进 -《浅谈估价函数在信息学竞赛的应用》 金 斌 -《欧几里得算法的应用》 曹钦翔 -《从“k倍动态减法游戏”出发探究一类组合游戏问题》 ## 2010~2012:组委会暂停论文答辩项目 ## 2013 彭天翼 -《登顶计划》 王康宁 -《方格取数》 罗 干 -《Two strings 试题讨论》 张闻涛 -《Catch The Penguins》 罗剑桥 -《浅谈分块思想在一类数据处理问题的应用》 乔明达 -《搜索问题的meet in the middle技巧》 胡渊鸣 -《浅析信息学竞赛概率论的基础与应用》 许昊然 -《浅谈数据结构题的几个非经典解法》 陈立杰 -《重量平衡树和后缀平衡树在信息学奥赛的应用》 高胜寒 -《浅谈状计数问题》 王子昱 -《分块方法的应用》 王 迪 -《浅谈容斥原理》 ## 2014 王子昱 -《MSS 命题报告》 余行江 -《矩阵 命题报告》 董宏华 -《多变的多边形》 岑若虚 -《对置换群有关算法的初步研究》 匡正非 -《浅谈线性相关》 张恒捷 -《关于三维最小乘积生成树的一些研究》 徐 毅 -《浅谈回文子串问题》 梁泽宇 - 《浅谈维护多维数组的方法在数据结构题的应用》 **王悦同 -《根号算法——不只是分块》** **黄志翱 -《浅谈动态树的相关问题及简单拓展》** **胡泽聪 -《随机化算法在信息学竞赛的应用》** **何 琦 -《精细地实现程序——浅谈OI竞赛的常数优化》** **沈 洋 -《回归本源——位运算及其应用》** **俞鼎力 -《寻找第 k 优解的几种方法》** ## 2015 刘研绎 -《后缀自动机在字典树上的拓展》 **任之洲 -《浅谈启发式思想在信息学竞赛的应用》** 王鉴浩 -《浅谈字符串匹配的几种方法》 张天扬 -《后缀自动机及其应用》 金 策 -《生成函数的运算与组合计数问题》 刘剑成 -《YDC的奖金命题报告》 邹逍遥 -《浅谈分块在一类在线问题的应用》 王逸松 -《仙人掌相关算法及其应用》 陈胤伯 -《浅谈图的匹配算法及其应用》 陈思禹 -《浅谈信息学竞赛的物理问题》 于纪平 -《丢失的题面命题报告》 张恒捷 -《DP的一些优化技巧》 杜瑜皓 -《Product命题报告》 卢啸尘 -《关于以源代码为输入的一类问题的初步探索》 吕凯风 -《集合幂级数的性质与应用及其快速算法》 ## 2016 **任之洲 -《积性函数求和的几种方法》** **姜志豪 -《网络流的一些建模方法》** 董克凡 -《浅谈线性规划与对偶问题》 王文涛 -《浅谈无向图最小割问题的一些算法及应用》 邹逍遥 -《浅谈线性规划在信息学竞赛的应用》 **吉如一 -《区间最值操作与历史最值问题》** **毛 啸 -《再探快速傅里叶变换》** **罗哲正 -《从Unknown谈一类支持末尾插入删除的区间信息维护方法》** 洪华敦 -《小C的后缀数组命题报告》 张浩威 -《消消看 命题报告》 李子豪 -《《strakf》命题报告》 汪文潇 -《《过去的集合》命题报告》 **吴作凡 -《火车司机出秦川 命题报告》** 金 策 -《基础排序算法练习题》 袁宇韬 -《move命题报告》 ## 2017 毛 啸 -《关于数列递归式的一些研究》 **杨家齐 -《基于线性代数的一般图匹配》** 袁宇韬 -《多项式求和》 **钟知闲 -《浅谈信息学竞赛的独立集问题》** 陈俊锟 -《“神奇的子图”命题报告及其拓展》 孙耀峰 -《动态传递闭包问题的探究》 汪乐平 -《“A+B Problem”命题报告》 **徐明宽 -《非常规大小分块算法初探》** 翁文涛 -《回文树及其应用》 闫书弈 -《“黑白树”命题报告》 杨景钦 -《“正多边形”命题报告》 冯 哲 -《浅谈决策单调性动态规划的线性解法》 沈 睿 -《“被操纵的线段树”命题报告》 赵晟宇 -《计算机逻辑与艺术初探——基于逻辑的钢琴演奏音符力度模型》 洪华敦 -《“基因组重构”命题报告》 ## 2018 杨懋龙 - 《浅谈生成函数在掷骰子问题上的应用》 陈江伦 - 《“后缀树结点数”命题报告及一类区间问题的优化》 高睿泉 - 《浅谈保序回归问题》 吴瑾昭 - 《“Fim 4”命题报告》 任轩笛 - 《解决树上连通块问题的一些技巧和工具》 梁晏成 - 《“Jellyfish”命题报告及拓展探究》 王思齐 - 《LeafyTree及其实现的加权平衡树》 陈嘉乐 - 《“小H爱染色”命题报告》 朱震霆 - 《一些特殊的数论函数求和问题》 刘承奥 - 《浅谈DFT在信息学竞赛的应用》 林旭恒 - 《“完美的队列”命题报告》 杨乾澜 - 《浅谈拟阵的一些拓展及其应用》 董炜隽 - 《浅谈Splay与Treap的性质及其应用》 何天 - 《“最小方差生成树”命题报告》 陈 通 - 《欧拉图相关的生成与计数问题探究》 ## 2019 钟子谦 - 《两类递推数列的性质和应用》 王修涵 - 《浅谈图模型上的随机游走问题》 杨骏昭 - 《“小水题”命题报告》 高嘉煊 - 《浅谈图的点着色问题》 戴 言 - 《浅谈格路计数相关问题》 李佳衡 - 《算法竞赛一些数论问题的推广与高斯整数初探》 范致远 - 《“基础圆方树练习题”命题报告》 徐翊轩 - 《“整点计数”命题报告以及对高斯整数的若干研究》 张哲宇 - 《浅谈树上分治算法》 吴思扬 - 《“组合数求和”命题报告》 王思齐 - 《浅谈一类简洁数据结构》 陈孙立 - 《子串周期查询问题的相关算法及其应用》 吴作同 - 《“公园”命题报告》 孔朝哲 - 《浅谈可追溯化数据结构》 袁方舟 - 《浅谈杨氏矩阵在信息学竞赛的应用》 ## 推荐文章 许智磊 -《后缀数组》 罗穗骞 -《后缀数组——处理字符串的有力工具》 朱泽园 -《半平面交的新算法及其实用价值》 胡伯涛 -《最小割模型在信息学竞赛的应用》 方展鹏 -《浅谈如何解决不平等博弈问题》 陈丹琦 -《基于连通性状态压缩的动态规划问题》 贾志豪 -《组合游戏略述——浅谈SG游戏的若干拓展及变形》 武 森 -《浅谈信息学竞赛的“0”和“1”》 李骥扬 -《线段跳表——跳表的一个拓展》 周 源 -《浅析"最小表示法"思想在字符串循同构问题的应用》 高逸涵 -《数位计数问题解法研究》 张昆玮 -《数学归纳法与解题之道》 漆子超 -《分治算法在树的路径问题的应用》 俞华程 -《矩阵乘法在信息学的应用》 陈瑜希 -《Pólya计数法的应用》 # 论文分类汇总(1999-2009) ## 组合数学 ### 计数与统计 2001 - 符文杰:《Pólya原理及其应用》 2003 - 许智磊:《浅谈补集转化思想在统计问题的应用》 2007 - 周冬:《生成树的计数及其应用》 2008 - 陈瑜希《Pólya计数法的应用》 ### 数位问题 2009 - 高逸涵《数位计数问题解法研究》 2009 - 刘聪《浅谈数位类统计问题》 ### 动态统计 2004 - 薛矛:《解决动态统计问题的两把利刃》 2007 - 余江伟:《如何解决动态统计问题》 ### 博弈 2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 2007 - 王晓珂:《解析一类组合游戏》 2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》 2009 - 方展鹏《浅谈如何解决不平等博弈问题》 2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》 ### 母函数 2009 - 毛杰明《母函数的性质及应用》 ### 拟阵 2007 - 刘雨辰:《对拟阵的初步研究》 ### 线性规划 2007 - 李宇骞:《浅谈信息学竞赛的线性规划——简洁高效的单纯形法实现与应用》 ### 置换群 2005 - 潘震皓:《置换群快速幂运算研究与探讨》 ### 问答交互 2003 - 高正宇:《答案只有一个——浅谈问答式交互问题》 ### 猜数问题 2003 - 张宁:《猜数问题的研究:一题的推广》 2006 - 龙凡:《一类猜数问题的研究》 ## 数据结构 ### 数据结构 2005 - 何林:《数据关系的简化》 2006 - 朱晨光:《基本数据结构在信息学竞赛的应用》 2007 - 何森:《浅谈数据的合理组织》 2008 - 曹钦翔《数据结构的提炼与压缩》 ### 结构联合 2001 - 高寒蕊:《从圆桌问题谈数据结构的综合运用》 2005 - 黄刚:《数据结构的联合》 ### 块状链表 2005 - 蒋炎岩:《数据结构的联合——块状链表》 2008 - 苏煜《对块状链表的一点研究》 ### 动态树 2006 - 陈首元:《维护森林连通性——动态树》 2007 - 袁昕颢:《动态树及其应用》 ### 左偏树 2005 - 黄源河:《左偏树的特点及其应用》 ### 跳表 2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》 2009 - 李骥扬《线段跳表——跳表的一个拓展》 ### SBT 2007 - 陈启峰:《Size Balance Tree》 ### 线段树 2004 - 林涛:《线段树的应用》 ### 单调队列 2006 - 汤泽:《浅析队列在一类单调性问题的应用》 ### 哈希表 2005 - 李羽修:《Hash函数的设计优化》 2007 - 杨弋:《Hash在信息学竞赛的一类应用》 ### Splay 2004 - 杨思雨:《伸展树的基本操作与应用》 ## 图论 ### 图论 2005 - 任恺:《图论的基本思想及方法》 ### 模型建立 2004 - 黄源河:《浅谈图论模型的建立与应用》 2004 - 肖天:《“分层图思想”及其在信息学竞赛的应用》 ### 网络流 2001 - 江鹏:《从一道题目的解法试谈网络流的构造与算法》 2002 - 金恺:《浅谈网络流算法的应用》 2007 - 胡伯涛:《最小割模型在信息学竞赛的应用》 2007 - 王欣上:《浅谈基于分层思想的网络流算法》 2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛的应用》 ### 最短路 2006 - 余远铭:《最短路算法及其应用》 2008 - 吕子鉷《浅谈最短径路问题的分层思想》 2009 - 姜碧野《SPFA算法的优化及应用》 ### 欧拉路 2007 - 仇荣琦:《欧拉回路性质与应用探究》 ### 差分约束系统 2006 - 冯威:《数与图的完美结合——浅析差分约束系统》 ### 平面图 2003 - 刘才良:《平面图在信息学的应用》 2007 - 古楠:《平面嵌入》 ### 2-SAT 2003 - 伍昱:《由对称性解2-SAT问题》 ### 最小生成树 2004 - 吴景岳:《最小生成树算法及其应用》 2004 - 汪汀:《最小生成树问题的拓展》 ### 二分图 2005 - 王俊:《浅析二分图匹配在信息学竞赛的应用》 ### Voronoi图 2006 - 王栋:《浅析平面Voronoi图的构造及应用》 ### 偶图 2002 - 孙方成:《偶图的算法及应用》 ## 树 ### 树 2002 - 周文超:《树结构在程序设计的运用》 2005 - 栗师:《树的乐园——一些与树有关的题目》 ### 路径问题 2009 - 漆子超《分治算法在树的路径问题的应用》 ### 最近公共祖先 2007 - 郭华阳:《RMQ与LCA问题》 ### 划分问题 2004 - 贝小辉:《浅析树的划分问题》 ## 数论 ### 欧几里得算法 2009 - 金斌《欧几里得算法的应用》 ### 同余方程 2003 - 姜尚仆:《模线性方程的应用——用数论方法解决整数问题》 ## 搜索 ### 搜索 2001 - 骆骥:《由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性》 2002 - 王知昆:《搜索顺序的选择》 2005 - 汪汀:《参数搜索的应用》 ### 启发式 2009 - 周而进《浅谈估价函数在信息学竞赛的应用》 ### 优化 2003 - 金恺:《探寻深度优先搜索的优化技巧——从正方形剖分问题谈起》 2003 - 刘一鸣:《一类搜索的优化思想——数据有序化》 2006 - 黄晓愉:《深度优先搜索问题的优化技巧》 ## 背包问题 2009 - 徐持衡《浅谈几类背包题》 ## 匹配 2004 - 楼天城:《匹配算法在搜索问题的巧用》 ## 概率 ### 概率 2009 - 梅诗珂《信息学竞赛概率问题求解初探》 ### 数学期望 2009 - 汤可因《浅析竞赛一类数学期望问题的解决方法》 ## 字符串 ### 字符串 2003 - 周源:《浅析“最小表示法”思想在字符串循同构问题的应用》 ### 多串匹配 2004 - 朱泽园:《多串匹配算法及其启示》 2006 - 王赟:《Trie图的构建、活用与改进》 2009 - 董华星《浅析字母树在信息学竞赛的应用》 ### 后缀数组 2004 - 许智磊:《后缀数组》 2009 - 罗穗骞《后缀数组——处理字符串的有力工具》 ### 字符串匹配 2003 - 饶向荣:《病毒的DNA———剖析一道字符匹配问题解析过程》 2003 - 林希德:《求最大重复子串》 ## 动态规划 ### 动态规划 2001 - 俞玮:《基本动态规划问题的扩展》 2006 - 黄劲松:《贪婪的动态规划》 2009 - 徐源盛《对一类动态规划问题的研究》 ### 状态压缩 2008 - 陈丹琦《基于连通性状态压缩的动态规划问题》 ### 状态设计 2008 - 刘弈《浅谈信息学状态的合理设计与应用》 ### 树形DP 2007 - 陈瑜希:《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》 ### 优化 2001 - 毛子青:《动态规划算法的优化技巧》 2003 - 项荣璟:《充分利用问题性质——例析动态规划的“个性化”优化》 2004 - 朱晨光:《优化,再优化!——从《鹰蛋》一题浅析对动态规划算法的优化》 2007 - 杨哲:《凸完全单调性的加强与应用》 ## 计算几何 ### 立体几何 2003 - 陆可昱:《长方体体积并》 2008 - 高亦陶《从立体几何问题看降低编程复杂度》 ### 计算几何思想 2004 - 金恺:《极限法——解决几何最优化问题的捷径》 2008 - 程芃祺《计算几何的二分思想》 2008 - 顾研《浅谈随机化思想在几何问题的应用》 ### 圆 2007 - 高逸涵:《与圆有关的离散化》 ### 半平面交 2002 - 李澎煦:《半平面交的算法及其应用》 2006 - 朱泽园:《半平面交的新算法及其实用价值》 ## 矩阵 ### 矩阵 2008 - 俞华程《矩阵乘法在信息学的应用》 ### 高斯消元 2002 - 何江舟:《用高斯消元法解线性方程组》 ## 数学方法 ### 数学思想 2002 - 何林:《猜想及其应用》 2003 - 邵烜程:《数学思想助你一臂之力》 ### 数学归纳法 2009 - 张昆玮《数学归纳法与解题之道》 ### 多项式 2002 - 张家琳:《多项式乘法》 ### 数形结合 2004 - 周源:《浅谈数形结合思想在信息学竞赛的应用》 ### 黄金分割 2005 - 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》 ## 其他算法 ### 遗传算法 2002 - 张宁:《遗传算法的特点及其应用》 2005 - 钱自强:《关于遗传算法应用的分析与研究》 ### 信息论 2003 - 侯启明:《信息论在信息学竞赛的简单应用》 ### 染色与构造 2002 - 杨旻旻:《构造法——解题的最短路径》 2003 - 方奇:《染色法和构造法在棋盘上的应用》 ## 一类问题 ### 区间 2008 - 周小博《浅谈信息学竞赛的区间问题》 ### 序 2005 - 龙凡:《序的应用》 ### 系 2006 - 汪晔:《信息学的参考系与坐标系》 ### 物理问题 2008 - 方戈《浅析信息学竞赛一类与物理有关的问题》 ### 编码与译码 2008 - 周梦宇《码之道—浅谈信息学竞赛的编码与译码问题》 ### 对策问题 2002 - 骆骥:《浅析解“对策问题”的两种思路》 ## 优化 ### 算法优化 2002 - 孙林春:《让我们做得更好——从解法谈程序优化》 2004 - 胡伟栋:《减少冗余与算法优化》 2005 - 杨弋:《从的解法谈算法的优化》 2006 - 贾由:《由图论算法浅析算法优化》 ### 程序优化 2006 - 周以苏:《论反汇编在时间常数优化的应用》 2009 - 骆可强《论程序底层优化的一些方法与技巧》 ### 语言 C++ 2004 - 韩文弢:《论C++语言在信息学竞赛的应用》 ## 策略 ### 策略 2004 - 李锐喆:《细节——不可忽视的要素》 2005 - 朱泽园:《回到起点——一种突破性思维》 2006 - 陈启峰:《“约制、放宽”方法在解题的应用》 2006 - 李天翼:《从特殊情况考虑》 2007 - 陈雪:《问题的变与不变》 2008 - 肖汉骏《例谈信息学竞赛分析的“深”与“广”》 ### 倍增 2005 - 朱晨光:《浅析倍增思想在信息学竞赛的应用》 ### 二分 2002 - 李睿:《二分法与统计问题》 2002 - 许智磊:《二分,再二分!——从Mobiles(IOI2001)一题看多重二分》 2005 - 杨俊:《二分策略在信息学竞赛的应用》 ### 调整 2006 - 唐文斌:《“调整”思想在信息学的应用》 ### 随机化 2007 - 刘家骅:《浅谈随机化在信息学竞赛的应用》 ### 非完美算法 2005 - 胡伟栋:《浅析非完美算法在信息学竞赛的应用》 2008 - 任一恒《非完美算法初探》 ### 提交答案题 2003 - 雷:《结果提交类问题》 ### 守恒思想 2004 - 何林:《信息学守恒法的应用》 ### 极限法 2003 - 王知昆:《浅谈用极大化思想解决最大子矩形问题》 ### 贪心 2008 - 高逸涵《部分贪心思想在信息学竞赛的应用》 ### 压缩法 2005 - 周源:《压去冗余缩得精华——浅谈信息学竞赛的“压缩法”》 ### 逆向思维 2005 - 唐文斌:《正难则反——浅谈逆向思维在解题的应用》 ### 穷举 2004 - 鬲融:《浅谈特殊穷举思想的应用》 ### 目标转换 2002 - 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》 2004 - 栗师:《转化目标在解题的应用》 ### 类比 2006 - 周戈林:《浅谈类比思想》 ### 分割与合并 2006 - 俞鑫:《棋盘的棋盘——浅谈棋盘的分割思想》 2007 - 杨沐:《浅析信息学的“分”与“合”》 ### 平衡思想 2008 - 郑暾《平衡规划——浅析一类平衡思想的应用》
本书带完整书签 第1章 基础 1 1.1 基础编程模型 4 1.1.1 Java程序的基本结构 4 1.1.2 原始数据类塑与表达式 6 1.1.3 语句 8 1.1.4 简便记法 9 1.1.5 数组 10 1.1.6 静态方法 12 1.1.7 API 16 1.1.8 字符串 20 1.1.9 输入输出 21 1.1.10 二分査找 28 1.1.11 展望 30 1.2 数据抽象 38 1.2.1 使用抽象数据类型 38 1.2.2 抽象数据类型举例 45 1.2.3 抽象教据类型的实现 52 1.2.4 更多抽象数据类型的实现 55 1.2.5 数据类型的设计 60 1.3 背包、队列和栈 74 1.3.1 API 74 1.3.2 集合类數据类型的实现 81 1.3.3 链表 89 1.3.4 综述 98 1.4 算法分析 108 1.4.1 科学方法 108 1.4.2 观察 108 1.4.3 数学模型 112 1.4.4 增长数量级的分类 117 1.4.5 设计更快的算法 118 1.4.6 倍率实验 121 1.4.7 注意事项 123 1.4.8 处理对于输入的依赖 124 1.4.9 内存 126 1.4.10 展望 129 1.5 案例研究:union-find算法 136 1.5.1 动态连通性 136 1.5.2 实现 140 1.5.3 展望 148 第2章 排序 152 2.1 初级排序算法 153 2.1.1 游戏规则 153 2.1.2 选择排序 155 2.1.3 插入排序 157 2.1.4 排序算法的可视化 159 2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 排序算法的复杂度 177 2.3 快速排序 182 2.3.1 基本算法 182 2.3.2 性能特点 185 2.3.3 算法改进 187 2.4 优先队列 195 2.4.1 API 195 2.4.2 初级实现 197 2.4.3 堆的定义 198 2.4.4 堆的算法 199 2.4.5 堆排序 205 2.5 应用 214 2.5.1 将各种數据排序 214 2.5.2 我应该使用啷种排序算法 218 2.5.3 问题的归约 219 2.5.4 排序应用一览 221 第3章查找 227 3.1 符号表 228 3.1.1 API 228 3.1.2 有序符号表 230 3.1.3 用例举例 233 3.1.4 无序链表的顺序查找 235 3.1.5 有序數组的二分查找 238 3.1.6 对二分査找的分析 242 3.1.7 预览 244 3.2 二叉查找树 250 3.2.1 基本实现 250 3.2.2 分析 255 3.2.3 有序性相关的方法与删除操作 257 3.3 平衡査找树 269 3.3.1 2-3査找树 269 3.3.2 红黑二叉查找树 275 3.3.3 实现 280 3.3.4 删除操作 282 3.3.5 红黑树的性质 284 3.4 散列表 293 3.4.1 散列函数 293 3.4.2 基于拉链法的散列表 297 3.4.3 基于线性探测法的散列表 300 3.4.4 调整教组大小 304 3.4.5 内存使用 306 3.5 应用 312 3.5.1 我应该使用符号表的哪种实现 312 3.5.2 集合的API 313 3.5.3 字典类用例 315 3.5.4 索引类用例 318 3.5.5 稀疏向量 322 第4章 图 329 4.1 无向图 331 4.1.1 术语表 331 4.1.2 表示无向图的数据类型 333 4.1.3 深度优先搜索 338 4.1.4 寻找路径 342 4.1.5 广度优先搜索 344 4.1.6 连通分量 349 4.1.7 符号图 352 4.1.8 总结 358 4.2 有向图 364 4.2.1 术语 364 4.2.2 有向图的数据类型 365 4.2.3 有向图的可达性 367 4.2.4 和有向无图 369 4.2.5 有向图的强连通性 378 4.2.6 总结 385 4.3 最小生成树 390 4.3.1 原理- 391 4.3.2 加权无向图的数据类型 393 4.3.3 最小生成树的API和测试用例 396 4.3.4 Prim算法 398 4.3.5 Prim算法的即时实现 401 4.3.6 Kruskal算法 404 4.3.7 展望 407 4.4 最短路径 412 4.4.1 最短路径的性质 413 4.4.2 加权有向图的数据结构 414 4.4.3 最短路径算法的理论基础 420 4.4.4 Dijkstra算法 421 4.4.5 无加权有向图的最短路径算法 425 4.4.6 一般加权有向图的最短路径问题 433 4.4.7 展望 445 第5章 字符串 451 5.1 字符串排序 455 5.1.1 键索引计数法 455 5.1.2 低位优先的字符串排序 458 5.1.3 高位优先的字符串排序 461 5.1.4 三向字符串快速排序 467 5.1.5 字符串排序算法的选择 470 5.2 单词查找树 474 5.2.1 单词查找树 475 5.2.2 单词查找树的性质 483 5.2.3 三向单词查找树 485 5.2.4 三向单词查找树的性质 487 5.2.5 应该使用字符串符号表的哪种实现 489 5.3 子字符串查找 493 5.3.1 历史简介 493 5.3.2 暴力子字符串査找算法 494 5.3.3 Knuth-Morris-Pratt子字符串查找算法 496 5.3.4 Boyer-Moore字符串查找算法 502 5.3.5 Rabin-Karp指纹字符串查找算法 505 5.3.6 总结 509 5.4 正则表达式 514 5.4.1 使用正则表达式描述模式 514 5.4.2 缩略写法 516 5.4.3 正则表达式的实际应用 517 5.4.4 非确定有限状态自动机 518 5.4.5 模拟NFA的运行 520 5.4.6 构造与正则表达式对应的NFA 522 5.5 数据压缩 529 5.5.1 游戏规则 529 5.5.2 读写二进制数据 530 5.5.3 局限 533 5.5.4 热身运动:基因组 534 5.5.5 游程编码 537 5.5.6 霍夫曼压缩 540 第6章背景 558 索引 611
可以使用Tarjan算法来寻找桥。在Tarjan算法,我们使用一个DFS来遍历整个图,同时记录每个节点的深度和能够到达的最小深度。 当我们遍历到一个节点时,我们将其标记为已访问,并将其深度和最小深度都设置为当前深度。然后我们遍历该节点的所有邻居节点,对于每个邻居节点,如果其未被访问过,则递归地调用DFS,并将其最小深度更新为其自身深度和所有子节点的最小深度的最小值。 当我们回溯到当前节点时,如果当前节点的最小深度仍然等于其深度,则说明该节点不是关节点。但是,如果当前节点的最小深度大于其深度,则说明该节点是关节点,并且其所有与其相邻的未访问过的节点与该节点之间的边都是桥。 以下是一个示例代码,用来找到图的桥: ``` #include <iostream> #include <vector> using namespace std; const int MAXN = 10005; vector<int> adj[MAXN]; bool visited[MAXN]; int depth[MAXN]; int low[MAXN]; int parent[MAXN]; int bridgeCount = 0; void findBridges(int u) { visited[u] = true; depth[u] = low[u] = depth[parent[u]] + 1; for (int v : adj[u]) { if (!visited[v]) { parent[v] = u; findBridges(v); low[u] = min(low[u], low[v]); if (low[v] > depth[u]) { bridgeCount++; cout << "Bridge found: " << u << " - " << v << endl; } } else if (v != parent[u]) { low[u] = min(low[u], depth[v]); } } } int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 1; i <= n; i++) { if (!visited[i]) { parent[i] = 0; findBridges(i); } } cout << "Number of bridges: " << bridgeCount << endl; return 0; } ``` 假设输入的图是这样的: ``` 6 7 1 2 1 3 2 3 2 4 4 5 5 6 4 6 ``` 运行以上代码,输出结果如下: ``` Bridge found: 2 - 4 Bridge found: 4 - 6 Number of bridges: 2 ``` 可以看到,我们成功地找到了图的两个桥,它们分别是2-4和4-6。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值