图论
文章平均质量分 66
兜率工
XJTU 硕士研究生在读
展开
-
Bellmen-Ford——解决负权边
参考啊哈算法第六章第三节:#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <math.h&a原创 2018-02-27 17:51:28 · 476 阅读 · 0 评论 -
Bellman-Ford的优先队列
参考啊哈算法第六章第四节#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <math.h>using namespace std;const int in原创 2018-02-27 21:01:35 · 313 阅读 · 0 评论 -
最短路径算法对比分析以及总结心得
参考啊哈算法第六章第5节 Dijkstra算法的思想:用一个数组dis来记录个个顶点到原点的距离,然后每次扫描数组dis,从中选择离顶点最近的顶点(假设这个点为j),看通过该顶点的边能否更新源点到各个顶点的距离,即如果dis[k]>dis[j]+e[j][k](1<=k<=n),则更新dis[k]=dis[j]+e[j][k]; 下面这两个均是用二维数组进行存储 Flo...原创 2018-02-27 21:05:15 · 1549 阅读 · 0 评论 -
Floyed-Warshall最短路径算法
代码如下:#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <math.h&amp原创 2018-02-24 20:01:21 · 397 阅读 · 0 评论 -
Dijkstra算法——单源最短路
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <math.h>using namespace std;const int inf=原创 2018-02-24 22:08:07 · 267 阅读 · 0 评论 -
UVA 10305 (拓扑排序)删边法+dfs
删边法:#include <stdio.h>#include<cstring>#include<list>#include<queue>#include<vector>using namespace std;int main(){ int n,m; int in[105]; while(s...原创 2018-06-11 21:09:01 · 141 阅读 · 0 评论 -
拓扑排序总结
删边法邻接表list存储边的信息,in数组为入度,读入边的信息后,将入度为0的点加入队列中,从队首开始,进行删边操作,每删除一个顶点,即链接的边的入度减一,如果入度变为0,将改点加入,直到结束为止。dfs计算 将顶点信息存入,完成后从第一个顶点开始进行dfs, for(int i=1;i&lt;=n;i++) if(!vis[i]) dfs(i);...原创 2018-06-11 21:20:34 · 211 阅读 · 0 评论 -
UVA 196 POJ 1420 (拓扑排序--删边法)
拓扑排序; 刚开始想的直接模拟,但没考虑到要是表达式里给的还没给出的边的话,就没法算呀。 看了吴永辉老师的题解,才明白是要进行拓扑排序,想想也很有道理,在我看来删边法最重要的三个部分:入度,邻接表,队列。 正好,这道题满足这三个条件,入度为零的点即为已知的点,压入队列中,对每个表达式项( i , j ),取出其中的每一项,计算其对应的行号 X 列号 Y ,(i,j)送入(x,y)的邻...原创 2018-06-13 16:24:28 · 365 阅读 · 0 评论 -
Ural 1024 (拓扑排序----删边法)
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<cmath>#inclu原创 2018-06-13 17:39:22 · 403 阅读 · 0 评论 -
图的割边割点算法总结
该算法使用深度优先搜索,定义两个数组,low数组跟num数组;对于某个顶点u,如果至少存在一个顶点v使得low[v]&gt;=num[u];既不能回到祖先,那么u为割点。 num表示当前顶点的时间戳,low表示当前顶点能够访问到最早顶点的时间戳; 割点算法: dfs中,枚举与当前顶点cur有关联的顶点i,如果i没被访问过,则dfs(i,cur),并且之后low=min(low[cur],lo...原创 2018-03-05 19:30:18 · 1021 阅读 · 0 评论 -
二分图最大匹配(匈牙利算法)
参考啊哈算法第八章第五节二分图: 如果一个图所有顶点能分为x,y两个集合,并且所有边的两个顶点恰好一个属于集合x一个属于集合y,即每个集合内的顶点没有边相连,那么此图就是二分图.//二分图最大匹配#include &amp;amp;lt;stdio.h&amp;amp;gt;#include &amp;amp;lt;string.h&amp;amp;gt;int e[101][101];int book[101];原创 2018-03-05 16:01:42 · 268 阅读 · 0 评论 -
图的割点(边)算法
参考啊哈算法第八章第三节,第四节: 先介绍图的割点算法 采用两种存储方法: 1.数组存储 2.图的邻接矩阵存储法第一种方法:#include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;int min(int a,int b){ return a&amp;amp;amp;lt;b?a:b;}int n,m,e[9][9];int root,num[9],low[9],flag[9],ind原创 2018-03-04 14:05:08 · 1272 阅读 · 0 评论 -
再谈最小生成树(Prim算法)
Prim算法用最小堆,图的邻接矩阵存储法,实现。 时间复杂度大大优化,按照鄙人的理解,其原理大概是用图的邻接矩阵存储法存储图,然后创建一个最小堆,先弄一个最小生成树,刚开始只有一个元素,即1号元素,最小堆的顶部元素到最小生成树的距离即为最小堆到最小生成树的最小距离,然后取出最顶部元素,将最顶部元素放入最小生成树中,并且以最顶部元素为踏板算出其他顶点(非树顶点)到最小生成树的距离(类似于Dijks...原创 2018-03-02 23:36:16 · 460 阅读 · 0 评论 -
图的最小生成树 (Kruskal算法)
#include &amp;amp;lt;stdio.h&amp;amp;gt;struct edge{ int u; int v; int w;};int f[7],sum=0,cnt=0,n,m;//f数组大小根据n的值决定;struct edge t,e[10];//e数组的值由m的值决定。//快速排序void quicksort(int left,int righ...原创 2018-03-02 17:28:14 · 689 阅读 · 0 评论 -
最小生成树总结心得
两种方法: 1.对每对顶点进行排序,然后用并查集进行判断,即看看这两个顶点是否已经联通了。 查看代码 2.用类似于Dijkstr最短路径算法,计算每一条边到生成树的距离。 查看代码...原创 2018-03-05 17:19:35 · 3634 阅读 · 0 评论 -
POJ 2935 (BFS)
可以将图看成每一条边都是一个节点,这样就将6*6的图构成13*13的一个图,然后模拟即可。#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cstring&gt;#include&lt;string&gt;#include原创 2018-06-13 22:13:23 · 203 阅读 · 0 评论 -
UVA 208(dfs+剪枝)
刚开始做的时候没有剪枝,直接上来就是dfs,因为这种题太熟悉,估计像我这种菜鸡做这种题不带思考,直接上来就是dfs。 在TLE的一发后,意识到给的数据可能是个稠密图,dfs次数过多,肯定要超时,所以就得剪枝了,那么怎么减呢,很简单,先思考为什么会导致dfs次数过多,因为dfs了很多不必要的点,所以就是对不必要的点进行修剪,而判断一个点为不必要的点,那么这个点也就是肯定dfs到不了终点,现在看就有...原创 2018-06-14 01:18:49 · 316 阅读 · 0 评论 -
UVA 200 (拓扑排序)
没加换行引发的一场悲剧呀#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<cmath&原创 2018-06-14 01:57:35 · 268 阅读 · 0 评论 -
POJ 2485 (prim+堆)
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<cmath>#inclu原创 2018-06-22 00:18:56 · 125 阅读 · 0 评论 -
POJ 2251 (BFS)
很典型的一种BFS裸题。 直接怼就行#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<原创 2018-06-14 11:12:25 · 183 阅读 · 0 评论 -
POJ 2488 (dfs)
注意字典序。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<cmath>原创 2018-06-14 19:12:44 · 362 阅读 · 0 评论 -
POJ 3083 (bfs+dfs)(沿左边+沿右边+最短路)
刚开始看到沿着左边走跟沿着右边走,一脸懵逼。。。。 看了题解还是不懂。 参考了别人博客。 参考博客#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#incl...原创 2018-06-15 00:01:43 · 233 阅读 · 0 评论 -
POJ 3009 (dfs)
不能被题目的这种纸老虎吓到,就是很平常的一个搜索,就是加了个限定条件是每次搜索只能走一行或者一列,相信自己一定能写出来的。 wa了半天,dfs里面直接判断mmp[i][j]是否能够等于一了,忘了下标会越界。。。。#include<iostream>#include<cstdio>#include<algorithm>#include<cst...原创 2018-06-15 20:01:29 · 257 阅读 · 0 评论 -
POJ 1416 (dfs求值问题)
自己做的: 0MS 就是有点繁琐,wa了几次#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include&原创 2018-06-16 00:07:10 · 188 阅读 · 0 评论 -
UVA 10687 (DFS)
题目说如果有多个站符合题意,就先选最西边,再选最南边。 刚开始没有太懂得他的意思,样例都懂不了,后来看了大神的代码,才明白是按x,y排序。 按照题意排序规则如下: 1.先找最接近的点。 2.如果距离相等,就先按x从小到大进行排序,再按照y从小到大排序。 对访问过的点进行标记, 从最开始的站进行搜索。返回值是搜索到的站的个数 从而判断输出结果。 由于每次到一个站都要进行排序,有点繁琐...原创 2018-06-16 11:04:38 · 306 阅读 · 0 评论 -
POJ 2383 (邻接表+bfs)
直接list建立邻接表,因为list插入删除操作比较快。 因为是无向图,所以两个节点得互相插入。 刚开始用dfs判断的是否能联通,但RE了,思想没问题,应该是爆栈了。 后来改用bfs实现,用了STL 里面的队列,有事一发TLE,一番无奈下,改用自己实现的队列进行操作,成功AC 还得注意过程中访问过的点要进行标记,因为重复访问会造成死循环。 AC代码如下:#include<i...原创 2018-06-16 16:25:48 · 358 阅读 · 0 评论 -
UVA 627 (Floyd最短路)
根据题目描述,很显然就是Floyd的思想,所以直接上来怼就行啦。。 熟悉Floyd思想,不明白的可以看这里Floyd-Warshall AC代码如下:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>...原创 2018-06-16 18:14:39 · 299 阅读 · 0 评论 -
POJ 2421 (Kruskal算法)
因为添加的边的数目小于N-1条,所以采用Kruskal算法比较适宜。 从小到大排序,必须还得借助一个结构体,有点繁琐,又因为题中给的数据是1-1000,较小,所以考虑直接k从1-1000进行判断,如果有权值等于k的,并且判断两个节点是否已经联通,如果没有的话,将两个节点的子树进行合并。#include<iostream>#include<cstdio>#inc...原创 2018-06-16 23:12:53 · 230 阅读 · 0 评论 -
POJ 1258 (典型Kruskal算法)
样例错了#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<cmath>原创 2018-06-17 01:33:33 · 301 阅读 · 1 评论 -
POJ 3013 SPFA(最大值很坑)
这题相当坑呀,。。。无语 根据题目描述,将条件进行转换,就会发现是求一个最短路。 因为稀疏图,选择SPFA 进行搞。 wa了我好几次,竟然是因为我把最大值定义为0x3fffffff 后来改成0x3f3f3f3f3f3f3f3f就AC了。。。 很是无语。。。。。 还没弄明白是干嘛这么是错的wuwu。。。#include<iostream>#include<cs...原创 2018-06-25 00:44:17 · 334 阅读 · 0 评论 -
POJ 3522 (最大边跟最小边差值最小的最小生成树)
可以肯定的是如果第一条边确定,那么这颗最小生成树的个边的权值就相应确定。 那么,对权值进行排序,挨个边进行枚举,从而确定最小值。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include&l...原创 2018-06-17 20:40:34 · 1145 阅读 · 0 评论 -
次小生成树
#define MAXN 0x3f3f3f3fusing namespace std;//#define debugconst int N=110;int mmp[N][N],path[N][N]; //path求得是i-j的最大边权int dis[N],pre[N];bool vis[N],used[N][N]; //used记录是否在最小生成树中。int n,m...原创 2018-06-18 01:09:24 · 103 阅读 · 0 评论 -
POJ 1679 (次小生成树入门)
直接用最小生成树跟此小生成树进行比较即可。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include&原创 2018-06-18 01:11:16 · 219 阅读 · 0 评论 -
POJ 2253 (floyed-warshall算法变形)
根据题意可以知道题目是求从第一个节点到第二个节点所有的路径中的最长的边的集合中的最小值。 所以根据floyd算法的思想,进行松弛操作。 dis[i][j]表示i节点到j节点的距离。 对于中间节点k来说,在当前路径中i到j的最大边即为`max(dis[i][k],max(dis[k)[j]); 然后取最小的边即为if(dis[i][j]>max(dis[i][k],dis[k][j...原创 2018-06-18 15:40:27 · 170 阅读 · 0 评论 -
POJ 2240 (Floyd)
思想很简单,此处不再阐述,附代码:#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cstring&gt;#include&lt;string&gt;#include&lt;map&gt;原创 2018-06-18 16:38:56 · 122 阅读 · 0 评论 -
UVA 2703 (WF) (Dijkstra)
刚开始想用dfs,后来想想,这要是用dfs的话节点之间的边过多那么,一方面容易爆栈,另一方面容易超时。 转换另一种思路,最段路径。 只有52个节点,用Dijkstra算法, 刚开始想这倒着算,但要是遇到城镇的化不好进行计算。 还是正着算好,但正着算又该如何计算呢,吴永辉老师告诉我们,直接二分模拟就好。从p到2的20次方,二分最多进行20次就好了。 但还得注意二分的方法。。。。。 害得我...原创 2018-06-18 21:09:25 · 125 阅读 · 0 评论 -
HDU 1385 UVA 523 (Bellman-Ford+Floyd)
Bellman-Ford 其实Bellman-Ford做这个题的解析刚开始看的我挺懵的,做了我一上午才慢慢搞懂,我可真垃圾呀。一开始死活看不懂,一直不明白那块为啥是Bellman-Ford,后来又回归定义,终于想通了。 用Bellman-Ford算法解这道题关键在与这段代码:for(int l=0;l&lt;n-1;l++){ for(int i=1;i&lt;=n;i++)...原创 2018-06-19 16:17:14 · 223 阅读 · 0 评论 -
UVA 10000(SPFA+邻接表)
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<map>#include<vector>#include<cmath>#inclu原创 2018-06-20 00:52:10 · 195 阅读 · 0 评论 -
Ural 1109 (匈牙利算法)
根据图论基本定里可得:边覆盖数+最大匹配数=定点数。所以计算边覆盖数就是答案,即用匈牙利算法解出最大匹配数即可。ac代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include&...原创 2018-07-16 23:40:54 · 283 阅读 · 1 评论 -
图论基本定理
尚未整理完,请见谅。先说一些概念:最大匹配:二分图中边集的数目最大的那个匹配;最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联;最小边覆盖:用尽量少的不相交简单路径覆盖有向无环图(DAG)G的所有顶点;最大独立集:在N个点的图G中选出m个点,使这m个点两两之间没有边的点中,m的最大值。二分图匹配:对于不存在孤立点的图,最大匹配+最小边覆盖=顶点数;最大独立集...原创 2018-07-16 23:43:41 · 2995 阅读 · 0 评论