图论
文章平均质量分 70
iYUNDI
iYUNDI
展开
-
最小生成树(MST)[简述][模板]
Prim(添点法) 1. 任选一点(一般选1), 作为切入点,设其与最小生成树的距离为0(实际上就是选一个点,将此树实体化),. 2. 在所有未选择的点中选出与最小生成树距离最短的, 累计其距离, 并标为已选. 若都选择了, 则得到了最小生成树(的总路长). 3. 更新与此点相邻的点"与最小生成树的距离".返回2.Kruskal(添边法) 1. 将所有点加入并查集, 每个点都是独立的集合 2. 将所有边按长度排序. 3. 拿出最小边, 判断两顶点是否在同一集原创 2013-08-18 20:35:57 · 915 阅读 · 0 评论 -
网络流Dinic算法详解及模板
在程序里,p表示找到的增广路径,p.top为路径中的最后一个顶点。一开始,p中只有源点。整个While循环分为2个操作。如果p的最后一个顶点为汇点,也就是说找到了增广路,那么对p增广,注意到增广后一定有一条或多条p中的边被删除了。这时,我们使增广路径后退至p中从源点可到达的最后一个顶点。如果p的最后一个顶点不为汇点,那么观察最后那个的顶点u 。若在层次图中存在从u连出的一条边,比如(u,v),我们就将顶点v放入路径p中,继续dfs遍历;否则,点u对之后的dfs遍历就没有用了,我们将点u以及层次图中连到u原创 2013-08-25 08:50:07 · 10895 阅读 · 0 评论 -
[poj 1149]PIGS[网络流][Edmonds-Karp][Dinic]
相当于首顾客是中转站, 是他可开猪圈中猪数之和.之后的顾客从首顾客中取出(若涉及首顾客所代表的猪圈)若有新圏被打开, 则该顾客将成为新圏的中转站,每个顾客向汇点连一条边, 边权为可买数, 表示此顾客作为中转站可以经手的猪数很多, 但带回家的数目是有限的.原创 2013-08-24 19:47:57 · 1362 阅读 · 0 评论 -
[HDU 2544]最短路[Dijkstra]
裸的最短路.#include #include #include using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 105;typedef struct node{ int v,w; node(){} node(int _v, int _w):v(_v),w(_w){}}no原创 2013-08-17 16:15:09 · 741 阅读 · 0 评论 -
[HDU 1535]Invitation Cards[SPFA反向思维]
题意: (欧洲人自己写的题面就是不一样啊...各种吐槽...果断还是看晕了)有向图, 有个源叫CCS, 求从CCS到其他所有点的最短路之和, 以及从其他所有点到CCS的最短路之和.思路:返回的时候是多个源,但是因为终点只有一个,所以把所有边反向之后, 再SPFA一次源即可.#include#include#includeconst int MAXN=1000000+10;t原创 2013-08-17 21:34:03 · 987 阅读 · 0 评论 -
[poj 1125]Stockbroker Grapevine[Floyd最短路]
题意:股票经纪人之间传递谣言. 给出一个股票经纪人的联系网络: a联系到b用时w.求: 选择哪一个人作为谣言的源头可以使得谣言传到所有人最快, 以及传到所有人所用时间.思路:Floyd算法可以求出全源最短路. 只要枚举每一个源s, 记录s到其他人的最大时间t, 比较t, 最小的那个对应的s即为所求.#include #include using namespace std原创 2013-08-18 12:27:24 · 1053 阅读 · 0 评论 -
[hoj 1632]Jungle Roads[Kruskal最小生成树模板题]
题意:求最小生成树的边长和.#include #include #include using namespace std;const int MAXN = 30;int f[MAXN];int n;typedef struct edge{ int u,v,w; edge(){} edge(int _u, int _v, int _w):u(_u),v原创 2013-08-18 21:09:56 · 827 阅读 · 0 评论 -
[HDU 1317]XYZZY[SPFA变形][最长路]
松弛操作直接关系到我们运行算法的目的----求最短路 如果与该点相邻的下一个点到源的距离可以因为通过该点中转而缩短 ,则更新此下一个点到源的最短距离, 也就相当于选择了走 经过该点中转这条路.(有点dp的意思?) 如果更新成功, 则意味着刚刚被更新的这一点有可能继续更新它临接的点. (如果没有被更新的话, 那么与它邻接的点, 要么已经被更新过(靠近源的,已出队的), 要么在队列中(靠近源的,在队列中), 要么还尚未涉及(远离源的), 就算询问也不可能执行松弛操作)而队列的优化(相对于原创 2013-08-17 21:10:42 · 1135 阅读 · 0 评论 -
[HDU 1548]A Strange Lift[Dijkstra最短路]
题意:电梯, 在第 i 层只能向上或向下走 ki 步, 问从 A 层到 B 层最少走多少步.思路:有向图求最短路. 用Dijkstra, 都是正权值.注意:vector要清空 ! ! ! [ 泪目]#include #include #include using namespace std;const int MAXN = 205;const int INF =原创 2013-08-17 15:35:45 · 822 阅读 · 0 评论 -
[HDU 4115]Eliminate Conflict[2-SAT]
http://www.cnblogs.com/ambition/archive/2011/11/09/Eliminate_the_Conflict.html题意:两个人石头剪刀布,一个人的出法是确定的,另一个人的出法有一定约束,某两次要相同或者不同,问你第二个人能否全部都不失败。思路:拆成六个点:石头(R), 非石头(~R) 布(P), 非布(~P)剪转载 2013-10-01 20:32:25 · 907 阅读 · 0 评论 -
[HDU 4118]Holiday's Accommodation[图论][非递归dfs]
题意:有一棵树, 节点表示城市, 每个城市有一个人. 人们要旅行到其他城市. 相当于一个置换. 求总的路程最大值.思路:ans = Σ (每条路长 l )*(经过这条路的最大次数 f )f = 2 * 这条边左边节点数和右边节点数最小值k. (这样左边的每一个点一定能够对应右边的某个点)这个k可以dfs 求得.但是直接dfs 会爆栈...需要将其改为非递归...原创 2013-10-01 19:19:28 · 1611 阅读 · 0 评论 -
[poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
由于并不知道图是否连通,要另设一个"超级源点", 连接图上的每个点, 从这个点出发就一定可以遍历到每一个点."超级源点"到每个点的边权是任意的,而它自己的点权自然是0.这样,就求出了一组满足每对点的差尽可能大, 并且其中的d[0] = 0的解.但是用SPFA只是判断负环的话,只需要初始时将所有点入队(而非只将源点入队), 然后判断每个点的入队次数. 如果超过点的总数, 说明存在负环.否则不存在.数值上是从INF开始减, 有负环的话就会一直减... 没有的话就会正常退出, 当然这个时候d[ ] 值会很原创 2013-08-24 11:30:20 · 1488 阅读 · 0 评论 -
[poj 3159]Candies[差分约束详解][朴素的考虑法]
本题中要求1号顶点和N号顶点的最大差值,感觉是"求最长路",为啥用一个求最短路的方法呢?其实是在于两个问题的关系.对于差分约束的方程组, 不等式可以全部都不取等号.而最短路中不等式的用途则是不断调整各个变量的值, 使其对于每一个不等式(限制), 都取满足它的"上界", 即松弛操作. 对应实际操作就是选择一条路. 对于每一条和这个点相连的路, 都会被询问一遍, 如果有更短的路, 就选择新的路. 即是如果发现新的限制条件, 就要[至少]满足(取等号,"上界").当所有的路都被询问, 亦即所有原创 2013-08-23 17:47:07 · 1174 阅读 · 0 评论 -
[poj 3678]Katu Pazzle[2-SAT常用建图法]
重点:突出"绑定性".连线表示限制而非可行. 因为最后要求对立点不在同一强连通分量是说同一强连通中的点必须同时选.坑:首先是算法记错了...inq是求SPFA用的...Tarjan中也少了个灰色点黑色点的判断(本身算是查漏补缺吧, 以后检查的时候首先还是看看模板有没有背错)...分身点加的是点的个数.异或0的那个判断粗心了...还是默认多组样例吧...原创 2013-08-21 21:07:28 · 1287 阅读 · 0 评论 -
[poj 1258]Agri-Net[Kruskal模板题]
题意:...不多说注意:输入是矩阵...有了并查集, 怎么也不想写Prim了....#include #include #include using namespace std;const int MAXN = 105;int f[MAXN];int n;typedef struct edge{ int u,v,w; edge(){}原创 2013-08-18 21:32:41 · 836 阅读 · 0 评论 -
[poj 2553]The Bottom of a Graph[Tarjan强连通分量]
在dfs的过程中,标记出度.设当前节点为u 若访问到了黑色点, 则出度不为0. 若访问到了灰色点, 正常 若访问到了白色点, 则这个白色点k 若被搜索之后属于同一强连通分量,则low[ k ] < dfn[ k ] (注意,并不一定有 low[ k ] < low[ u ], 因为k可能连接到了较靠后的灰色点,而u之前已经被较靠前的灰色点更新过). 若被搜索之后属于另一个(不同于u的)强连通分量, 那么可以证明 low[ k ] == d原创 2013-08-19 14:39:33 · 847 阅读 · 0 评论 -
[poj 2186]Popular Cows[Tarjan强连通分量]
题意:有一群牛, a会认为b很帅, 且这种认为是传递的. 问有多少头牛被其他所有牛认为很帅~思路:关键就是分析出缩点之后的有向树只能有一个叶子节点(出度为0).做法就是Tarjan之后缩点统计出度.原创 2013-08-19 15:35:08 · 781 阅读 · 0 评论 -
割点&割边模板
割点bool iscut[N];int dfn[N], low[N], Index, n;void tarjan(int x) {///对于无向图,只要连通,就是强连通! ///判断割点呢,就是只要他所进入的强连通分量low全部满足<=dfn[自己]就可以了 dfn[x] = low[x] = ++Index;///时间戳和low for (int tmp = v原创 2013-08-19 20:32:01 · 797 阅读 · 0 评论 -
[poj 1904]King's Quest[Tarjan强连通分量]
题意:(当时没看懂...)N个王子和N个女孩, 每个王子喜欢若干女孩. 给出每个王子喜欢的女孩编号, 再给出一种王子和女孩的完美匹配. 求每个王子分别可以和那些女孩结婚可以满足最终每个王子都能找到一个自己喜欢的女孩结婚.(需要避免的情况就是某个王子和自己喜欢的某个女孩结婚之后使得最终无法找到一个完美匹配)思路:(非独立思考想出...)将初始的每个完美匹配视为1个节点, u -> v表示u中的王子喜欢v中的女孩, 求这样一个图的强连通分量. 输出每个王子喜欢的,并且和他所在节点在同一个强连通分量中原创 2013-08-19 17:41:57 · 813 阅读 · 0 评论 -
[poj 1144]Network[Tarjan求割点]
题意:求一个图的割点. 输入略特别: 先输入图中点的总数, 接下来每一行首先给出一个点u, 之后给出一系列与这个点相连的点(个数不定). 行数也不定, 用0作为终止.这样的输入还是要保证以数字读入吧...gets没前途的思路:割点的模板啦~#include #include #include using namespace std;const int MAXN = 10原创 2013-08-20 08:00:59 · 1035 阅读 · 0 评论 -
拓扑排序[理论]
什么是拓扑序列通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学中关于偏序和全序的定义:若集合X上的关系是R,且R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy原创 2013-08-21 10:39:00 · 1535 阅读 · 0 评论 -
[HDU 1285]确定比赛顺序[拓扑排序模板题]
题意就是拓扑排序啦~坑:有重边 > #include #include using namespace std;const int MAXN = 505;int a[MAXN][MAXN];int in[MAXN],ans[MAXN];int n,m;bool TopologicalSort(){ for(int i=1;i<=n;i++) {原创 2013-08-21 11:24:54 · 874 阅读 · 0 评论 -
[HDU 2767]Proving Equivalences[Tarjan强连通缩点缩点]
题意:求对一个图补充最少的边使得其成为强连通图.思路:缩点是想到了,但是一是对"缩点"认识不够清晰,统计入度出度的时候想着想着又想成了实际的"点",于是就纠结在"不连通的强连通分量没有入度或出度为零的点",然后甚觉错误...其实啊,"shrink"的时候判断的是一条边两边的id是否相同,这已经是将强连通分量视为一个点了...一句话, 统计缩点之后的图中入度为零的点的个数原创 2013-08-20 20:18:33 · 861 阅读 · 0 评论 -
[poj 2307]Ikki's Story IV - Panda's Trick[2-SAT]
题意:连接圆周上标号 [ 0 .. n-1 ] 的点, 连接线可以放在圆内或圆外,但不能交叉(叠放). 给出点的个数n和相连的边(点对).判断是否可行.思路:2-SAT简单版:将每条连接线看成两个点, 分别表示在圆内, 圆外. 实际中这两个点能且只能取其一.枚举两根连接线的所有组合情况, 根据连接线所连两点的标号判断二者是否回相交.若会, 则必然一个在圆内, 一个在圆外.原创 2013-08-21 16:47:48 · 959 阅读 · 0 评论 -
[hoj 2507]The Bug Sensor Problem[第k长路]
题意:给出一些点的坐标, 求这些点之间的第k长边.本来的描述是, 一些点, 有效距离之内可以传送数据, 有效距离也表示耗电量. 可以放k个收发器, 收发器的有效距离无穷大. 所有点的耗电量设为相同, 问此时单点耗电量最小是多少.思路:先求最小生成树, 放k个传感器的话, 可以省去k-1条边(就是直接发走而不需要走这条边), 那么求出第k长边即可.特殊的,未加原创 2013-11-11 21:15:10 · 1370 阅读 · 0 评论