一周学习总结4.19

来源:互联网 发布:台服lol有mac版本吗 编辑:程序博客网 时间:2024/05/22 02:06

Dijkstra算法,求单源最短路径的算法。本质上是一种广度优先搜索的过程。

Prim 算法,另一种求MST的经典方法。与dij的算法很类似。使用二叉堆构造的最小优先级队列,可以改进算法的时间界。

Heap,二叉堆。可以进行堆排序和最大(最小)优先级队列。能够在Olgn)的时间内插入或修改堆中元素,并保持堆的性质。

Ford-Fulkerson算法,求最大流的基本算法。每次迭代中找出任意增广路径p,并把沿p每条边的流f加上其残留容量cf(p)

Edmonds-Karp算法,是对Ford-Fulkerson算法的改进。使用BFS求增广路径。能够优化算法的界,时间复杂度为O(V*E^2)

 

POJ 1797 Heavy Transportationdij的变形。在每条可行的路上取最“窄”的一段弧,问这些弧中最“宽”的是多少。(发现自己没办法用文字表达清楚意思,语文太差……)仔细想想就会发现,要使最“窄”的最“宽”,那整条路就应该是所有的路中最“宽”的。

 

POJ 3268 Silver Cow Partydij的逆向使用。求图上所有点到某特定点x再返回的距离中最大的。一开始想先用Floyd求所有点到x的距离,再用dijx到所有点的距离,相加找最大。比较直接的方法,但不幸的TLE了……Floyd用时太久。关键在于求单汇点的最短路径。就是dij的逆应用,不详细说了,就是把所有的弧都反向,那么汇点就变成源点,就成了单纯的dij

 

POJ 3159 Candies:求1n的最短路径。数据量很大,时间卡的很严。我用heap+dij。算是个模板题。第一次用堆,写了2天,CE, RE ,TLE, WA,什么错误都有了……用邻接表的话要先申请好内存,动态内存分配会TLE

 

POJ 2485 Highways:求MST中权值最大的边。虽然是第一次写prim,把前面heap+dij的代码改了改。轻松1Y

 

POJ 2253 Frogger:和1797思想完全一样。求所有可行路上最长的弧。只不过是“>”变“<”。题目其实还不怎么理解,稀里糊涂就AC了……不过我用的是2485的模板,primdij真的蛮像……

 

POJ 1426 Find The Multiple:为了练BFS找的题。第一次写BFS。以前做了几题搜索都是DFS。貌似这题有其他更好的方法……求一个数n的倍数m,要求m只含有01。从1开始每次尝试,若不能整除n就在该数的末尾加“0或“1,加入搜索序列,然后沿序列向下继续。说是m不超过100位,还好其实用__int64就可以满足长度要求,否则高精度就麻烦了。

 

POJ 3126 Prime Path:也是BFS。问一个素数,每次只改变一位变成另一个素数,最少要改变几次才能变成目标素数。从起始素数开始,每轮将所有可行的改变放入搜索队列。为了不重复,要设置标志位。我用数组来记录改变路径,每个结点指向其父结点。到达目标之后向上寻找到祖先,即可求出改变了几次。这题其实我写的很烂……150MS+

 

POJ 2255 Tree Recovery:已知树的前序遍历和中序遍历,求后续遍历。递归解之……

 

POJ 1306 Combinations:计算排列组合中Cm,n的问题。C = N! / (N-M)!M! 。我没用高精度。我是先除后乘。将大分数拆分成很多个小分数连乘,最后输出整数部分。double精度足够了。

 

POJ 2388 Who's in the Middle:发现POJ上水题也不少啊……qsort之后输出中间位置的值。

 

POJ 1273 Drainage Ditches:最大流的入门题。直接使用Ford-Fulkerson算法。

 

POJ 1459 Power Network1273是单case,所以增广路径怎么求都没关系,这题一开始我直接改1273的代码,结果就TLE。要用Edmonds-Karp来做。这题有多个源点和汇点,所以要自己建一个超级源点S和超级汇点T,然后直接用E-K算法。感觉又是模板题了……貌似求增广路径还有很多的方法,现在连入门都算不上。唉,慢慢学吧。

 

 

刚才看了数学建模的时间安排,当场囧到。好狠呐,周末从早到晚。五一之前100题不知道能不能完成。

原创粉丝点击