2012年12月12日

朱刘算法 && POJ3164 Command Network

摘要: 问题描述:求最小树形图的总权值。即以固定根为起点,沿给定有向边,可以访问到所有的点,并使所构成的边权值之和最小,求这个最小总权值。算法步骤:① 清除自环,输入的时候判断即可② 先判断从固定根开始是否可达所有原图中的点。简单搜索加标记位就可以。如果不可就不用说了,肯定没戏。③ 为除根之外的每个点选定一条最小入边。(记pre [vi]为该边的起点)④判断这个入边集是否存在有向环,如果不存在,我们很容易证明这个集合就是该图的最小树形图,转⑥,否则接⑤。(利用prev数组,枚举为检查过的点作为搜索的起点,做类似DFS的操作)⑤消环。设(u,i,w)表示从u到i的权为w的边。设刚才的有向环缩为新结点ne 阅读全文

posted @ 2012-12-12 12:54 澄哥 阅读(1241) 评论(0) 推荐(0) 编辑

Kruskal算法

摘要: 问题描述:求无向连通图G<V, E>最小生成树(MST)。(不知道什么是MST的见Prim算法中的算法依据一栏)算法步骤:本质是贪心。① 将G中的n个顶点看成是n个独立的连通分量,可记为T<V,X>② 每次找当前剩余的权值最小的边,若分属不同的连通分量,则将其加入T③ 重复②,直到所有点连通算法实现:① 取权值最小的边,可使用最小堆或快排。② 判断是否属于同一连通分量,可基于树的父指针表示法中的并查集算法。并查集可以使用重量权衡合并规则和路径压缩进行优化。算法补充:并查集算法:把n个节点分到多个集合,快速查找属于哪个集合,快速合并两个集合的算法。方法是使用森林,同一个集 阅读全文

posted @ 2012-12-12 12:42 澄哥 阅读(962) 评论(0) 推荐(0) 编辑

Prim 算法

摘要: 问题描述:求最小生成树(MST)。算法步骤:本质是贪心。① 初始集合MST为空.② 由图中任一顶点N开始,将N加入 MST。③ 找出外部顶点中与当前MST顶点相距最短的顶点M和边(M,N),加入MST④ 重复②直至全部节点都加入MST为止算法依据:关于最小生成树:最小生成树是总边权值最小的生成树,一个连通图的生成树是包含所有顶点的极小连通子图,极小连通子图是包含所有顶点的无环连通子图。最小生成树的性质:任取子集U ⊂ V且U≠∅,若u∈U,v∈V-U,且(u,v)在所有U到V-U的边中具有最小权值(又称为轻边),则必有一棵最小生成树包含(u,v)。用反证法易证。算法实现:View Code . 阅读全文

posted @ 2012-12-12 12:27 澄哥 阅读(183) 评论(0) 推荐(0) 编辑

Floyd 算法

摘要: 问题描述:给定一个带权图(可以有负权),求任意两点间的最短路。算法过程:本质是一个动态规划的过程。G中n个顶点的编号为1到n。令c[i][j][k]表示从i 到j 的最短路径的长度,其中中间顶点不超过k。如果G中包含边<i, j>,则c[i][j][0] =边<i, j> 的长度;否则c[i][j][0]= +∞。c[i][j][n] 则是从i 到j 的最短路径的长度。对于任意的k>0,通过分析可以得到:中间顶点不超过k的i到j的最短路径有两种可能:该路径含或不含中间顶点k。若不含,则该路径长度应为c[i][j[k-1],否则长度为c[i][k][k-1] +c 阅读全文

posted @ 2012-12-12 12:19 澄哥 阅读(220) 评论(0) 推荐(0) 编辑

Dijkstra算法

摘要: 问题描述:【单源最短路径问题】给定一个带权图(无负权)和一个指定的顶点V0,求出V0到所有其他各点的最短路径。算法过程: 本质也是个贪心算法。①所有顶点划分为两个集合S和D。初始S集合只有点V0,V0对应的距离值为0;剩余的顶点皆在D集合中,如果存在边<V0,Vi>,则Vi的距离值为此边的权值,否则Vi的距离值为∞②从D中选择离源距离值最小的顶点Vm加入到S集合③同时以Vm 作为中间顶点,更新距离值④重复②③直到D为空(或最小值也为∞)具体实现: 1.普通实现:更适合稠密图int min[N];//记录当前最小距离bool flag[N];//标志是否在集合S中int pre[N] 阅读全文

posted @ 2012-12-12 11:56 澄哥 阅读(202) 评论(0) 推荐(0) 编辑

2012年9月26日

POJ 2431 Expedition 贪心

摘要: 主要算法思路:假设他们的车可以瞬间移动到之前到达过段任意加油站加油。显然,将油用光顺移回到加油站加油再顺移回来和直接经过加油站的时候加油,并且走到没有由从结果上来说时完全等价。我们的策略是每次走到用光油,在瞬移回一下之前经过段加油站中油最多的地方加油,继续往前走,用光继续瞬移找经过的剩下的油最多段地方加油……直到到达城市,或将可加油全部加满也到达不了下一个加油站为止(这时返回-1)。贪心性质证明:设S{1,2,3…n}是所有加油站的集合,r为油箱中剩余油量,d为总路程。A{a1,a2,a3…am}是最优解。T{t1,t2…}是我们用贪心法得到的解,并按贪心的取解顺序排列(即)现证贪心解也是最优 阅读全文

posted @ 2012-09-26 18:27 澄哥 阅读(596) 评论(0) 推荐(1) 编辑

2012年5月29日

POJ 2965 The Pilots Brothers' refrigerator 贪心神解【转】

摘要: //POJ 2965 The Pilots Brothers' refrigerator// http://www.cppblog.com/Yusi-Xiao/archive/2010/07/05/77385.html// 先看一个简单的问题,如何把'+'变成'-'而不改变其他位置上的状态?// 答案是将该位置(i,j)及位置所在的行(i)和列(j)上所有的handle更新一次。// 结果该位置被更新了7次,相应行(i)和列(j)的handle被更新了4次,剩下的被更新了2次.// 被更新偶数次的handle不会造成最终状态的改变.// 因此得出高效解法 阅读全文

posted @ 2012-05-29 15:27 澄哥 阅读(981) 评论(0) 推荐(0) 编辑

2012年5月28日

POJ 1006 Biorhythms 生理周期 水题

摘要: POJ 1006 Biorhythms,同百炼2977 生理周期注意边界条件#include <iostream>using namespace std;int mod (int a, int b){ if (a >= 0) return a%b; else return (b-(-a)%b)%b;}int main(void){ int a, b, c, t; int r; for (int i = 1; ; i++) { cin >> a >> b >> c >> t; if (a < 0) ... 阅读全文

posted @ 2012-05-28 20:48 澄哥 阅读(253) 评论(0) 推荐(0) 编辑

2012年5月26日

POJ 1005 I Think I Need a Houseboat 水题

摘要: 水题一道//POJ 1005#include <iostream>#include <cmath>using namespace std;int main(){ int caseNum; float x, y; int n; cin >> caseNum; for (int i = 1; i <= caseNum; i++) { cin >> x >> y; n = ceil((x*x+y*y)*3.1415/100); cout << "Property "<<i<<&q 阅读全文

posted @ 2012-05-26 16:16 澄哥 阅读(227) 评论(0) 推荐(0) 编辑

2012年5月25日

POJ 1004 Financial Management 巨水

摘要: 求平均数,巨水题#include <iostream>#include <iomanip>using namespace std;int main(void){ float a, sum = 0.0; for(int i = 0; i < 12; i++) { cin >> a; sum +=a; } cout << "$" << sum/12 << setprecision(2) << setiosflags(ios::fixed) << endl; return 0;} 阅读全文

posted @ 2012-05-25 11:45 澄哥 阅读(136) 评论(0) 推荐(0) 编辑

导航