一天颓废记录-学了一点点图论

在学校效率真的很差,在家虽然非常颓废但一天学到了不少东西

昨天已经发布了关于一点概念及拓扑排序的简单整理,今天继续,不记下来就忘了

RQNOJ:

142,193都是最小生成树算法,prim或kruskal算法都能解决

关于最小生成树的算法,个人感觉是prim实现很简单,代码量和快排差不多,熟悉的话打出来根本不费时间,但是裸的prim复杂度达到|V|^2,如果是顶点很大的稀疏图就杯具了。kruskal涉及到快排、并查集和它自身的算法,算下来至少要qsort,findSet,union和main四个过程,代码量是prim的几倍,效率可以看成是快排的|E|log|E|.不过打prim我倒是debug很长时间最后一怒之下重新写了一遍才AC的,kruskal虽然是第一次几乎没什么错误。其实我觉得有时间的话应该要掌握prim+heap,那个斐波拉契堆就算了吧……

关于最小生成树,强烈建议看这里

564是有向图找环,我用的是|V|^2的拓扑排序,以后无聊的时候应该用队列优化的|V|+|E|的算法试试看

389是无向图找最小环,copy一段吧:

最小环问题
<1>朴素的算法:
令e(u,v)表示u和v之间的连边,再令min(u,v)表示,删除u和v之间的连边之后,u和v之间的最短路
最小环则是min(u,v) + e(u,v),时间复杂度是EV2。
<2>改进的方法:
在floyd的同时,顺便算出最小环
g[i][j]=(i,j之间的边长)
dist:=g;
for k:=1 to n do
begin
for i:=1 to k-1 do
for j:=i+1 to k-1 do
answer:=min(answer,dist[i][j]+g[i][k]+g[k][j]);
for i:=1 to n do
for j:=1 to n do
dist[i][j]:=min(dist[i][j],dist[i][k]+dist[k][j]);
end;
关于算法<2>的证明:
一个环中的最大结点为k(编号最大),与他相连的两个点为i,j,这个环的最短长度为g[i][k]+g[k][j]+i到j的路径中,所有结点编号都小于k的最短路径长度
根据floyd的原理,在最外层循环做了k-1次之后,dist[i][j]则代表了i到j的路径中,所有结点编号都小于k的最短路径
综上所述,该算法一定能找到图中最小环。

这段话可能最早来自这个PPT

关于有向图的最小环,我还没搞懂,可以参考这里

这里有关于“求有向图的所有环,此问题包括了求最大环或者最小环”的代码

341是很大数据的单源最短路,貌似要用SPFA,但是有人用dijstra+heap貌似更快。第一次打SPFA就碰到了这题,而且数据大必须要用邻接表,于是抄别人SPFA+指针实现的邻接表过了。看来看了一点汇编是很有好处的,从未用过指针的我一下子就有点会了。指针就是数字化的内存地址吗,和8086汇编的段地址+偏移地址而已,还更简单了。

先写到这吧。

你可能感兴趣的:(图论)