随笔分类 -  图论

摘要:这两个题目都是二分图的判定,用dfs染色比较容易写。算法流程:选取一个没有染色的点,然后将这个点染色,那么跟他相连的所有点一定是不同颜色的,所以,如果存在已经染过颜色的,如果和这个颜色相同的话,就说明不是二分图,否则,继续从这个点往下染。hihocoder#include #include #inc... 阅读全文
posted @ 2016-01-07 20:37 Howe_Young 阅读(323) 评论(0) 推荐(0)
摘要:次小生成树,就是求除了最小生成树之外最小的那个生成树。下面介绍一下利用prim求次小生成树的主要步骤。1.先求出来最小生成树。并将最小生成树任意两点之间路径当中的权值最大的那一条找出来,为什么要找最大的呢,因为生成树加入一条边之后一定构成了回路,那么肯定要去掉这个回路当中一条边才是生成树,那么,怎么... 阅读全文
posted @ 2015-10-26 18:17 Howe_Young 阅读(6690) 评论(4) 推荐(2)
摘要:每个单词可以看做一条边,每个字母就是顶点。有向图欧拉回路的判定,首先判断入度和出度,其实这个题判定的是欧拉通路,不一定非得构成环,所以可以有一个点的顶点入度比出度大1,另外一个点的出度比入度大1,或者每个点的出度和入度相等。用并查集判断是否弱联通。最后dfs求出欧拉路径,不过这个题是让求字典序最小的... 阅读全文
posted @ 2015-10-24 09:50 Howe_Young 阅读(489) 评论(0) 推荐(0)
摘要:几个入门的题目:hdu 1878判定一个图是否存在欧拉回路。直接判断图是否连通和每个点的度数是否为偶数就行了。(可用并查集判断连通,也可以用dfs)#include #include #include #include using namespace std;const int maxn = 110... 阅读全文
posted @ 2015-10-23 21:03 Howe_Young 阅读(927) 评论(0) 推荐(0)
摘要:给定一棵树求任意两个节点的公共祖先tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断。如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果访问过的话,那么它的最近公共祖先就是当前节点祖先。下面是tarjan离线模板:#include #in... 阅读全文
posted @ 2015-10-12 15:30 Howe_Young 阅读(247) 评论(0) 推荐(0)
摘要:题意比较费劲:输入看起来很麻烦。处理括号冒号的时候是用%1s就可以。还有就是注意它有根节点。。。Q次查询在线st算法/************************************************************************* > File Name: ... 阅读全文
posted @ 2015-10-08 20:53 Howe_Young 阅读(251) 评论(0) 推荐(0)
摘要:题目连接:http://acm.uestc.edu.cn/#/problem/show/92题意:给定一棵树,最后给加一条边,给定Q次查询,每次查询加上最后一条边之后是否比不加这条边要近,如果近的话,输出近多少,否则输出0思路:没加最后一条边之前两点之间的距离是dis(u) + dis(v) - 2... 阅读全文
posted @ 2015-10-08 20:48 Howe_Young 阅读(319) 评论(0) 推荐(0)
摘要:题意:给定一棵树,求任意两点之间的距离。思路:由于树的特殊性,所以任意两点之间的路径是唯一的。u到v的距离等于dis(u) + dis(v) - 2 * dis(lca(u, v)); 其中dis(u)表示u到根节点的距离。RMQ求LCA,过程如下,摘自http://dongxicheng.org/... 阅读全文
posted @ 2015-10-08 18:50 Howe_Young 阅读(382) 评论(0) 推荐(0)
摘要:转载自http://blog.csdn.net/acdreamers/article/details/16902023我们首先来看一下什么是前向星.前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的... 阅读全文
posted @ 2015-06-05 16:54 Howe_Young 阅读(686) 评论(0) 推荐(0)
摘要:这个题如果用邻接矩阵的话,由于n比较大,会超内存,所以选用邻接表的形式。还有就是这个题有那个等级的问题,一级比一级的福利高,所以不能直接拓扑排序,而是反过来,计算出度,找出度为0的顶点,然后更新出度数组,等级更新的时候要判断是否比原来的等级大,具体看代码 1 /*******************... 阅读全文
posted @ 2015-03-28 18:36 Howe_Young 阅读(846) 评论(0) 推荐(0)
摘要:这个题是个模板题,可以直接用拓扑排序的模板来做,AC代码#include #include#include using namespace std;const int N = 1000;int n, m;int Map[N][N];int topNum[N];bool toposort(int *r... 阅读全文
posted @ 2015-03-27 21:47 Howe_Young 阅读(171) 评论(0) 推荐(0)
摘要:这个题是个典型的最小生成树的题目,但是刚开始怎么都过不了,后来发现两种写法都有疏忽,但是prim的到目前为止不懂为什么刚开始的不对,kruskal算法,并查集的初始条件从0开始写成从1开始了,所以已知wa,还有这个题比最小生成树一个卡点就是处理两点之间的距离的时候,要保证点都在10-1000之间。其... 阅读全文
posted @ 2015-03-26 21:33 Howe_Young 阅读(191) 评论(0) 推荐(0)
摘要:Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把邻接矩阵里面它到其它点的距离复制过来就行了。剩下的步骤就是找到一个源点到其他点最小的距离,将它加入到... 阅读全文
posted @ 2015-03-24 21:50 Howe_Young 阅读(365) 评论(0) 推荐(0)