![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
紫书第十一章图论模型和算法
紫书第十一章
carut
这个作者很懒,什么都没留下…
展开
-
Euler Circuit UVA - 10735 混合图求解欧拉回路 fleury算法
问题分析这题目是混合图求解欧拉回路问题。来自百度的参考:https://baike.baidu.com/item/欧拉回路/10036484?fr=aladdin很多混合图问题可以转化为有向图,方法是将一条无向边变成两条方向相反的边。但是这一题需要找到一个欧拉回路,如果变成两条有向边答案就和原题不符了,例如一个三角形,三条边,一个有向边,两个无向边,可以找到一个欧拉回路,但是如果全变成...原创 2020-02-23 21:57:18 · 207 阅读 · 1 评论 -
Pool construction UVA - 1515 最小割模型
问题分析将问题转化为最小割问题,主要难点在数学模型的建立将草和洞分隔开,使人联想到了割的概念,从而想到了最大流最小割定理,可以将问题转化为最大流模型首先外围的格子上必须种草,如果有洞,就把洞变为草里面的各自中有洞和草,如何表示洞和草之间的转化费用?添加源点s和宿点t,规定和s相连的是草,和t相连的是洞,那么把草和洞抽象成点,s->草 洞->t建立图,s->洞之间边的容...原创 2020-02-22 23:56:48 · 124 阅读 · 0 评论 -
Funny Car Racing UVA - 12661
问题分析原创 2020-02-22 14:51:44 · 87 阅读 · 0 评论 -
dijkstra算法模板
struct Edge{ int from,to,dist; Edge(int from,int to,int dist):from(from),to(to),dist(dist){}};struct Node{ int d,u; Node(int d=0,int u=0):d(d),u(u) {} bool operator < (const ...原创 2020-02-22 14:10:44 · 331 阅读 · 0 评论 -
Optimal Bus Route Design UVA - 1349
问题分析按照紫书上的解释,将一个点拆分成两个点X_i,Y_i,就变成了一个二分图匹配问题,方法和上一题UVA1658优点相似,将入弧和出弧分别连接在两个点X_i,Y_i上,两点间不连接,因为他们实际上是一个点,不用计入cost中,然后添加源点宿点,源点连接在X_i上,Y_i连接到宿点上,求出源点,宿点之间的最小费用最大流,然后将二部图最终的对应点连接起来,就是最小权和的圈#include &...原创 2020-02-21 23:26:47 · 301 阅读 · 0 评论 -
最小费用最大流模板
struct MCMF{ int n,m; vector<Edge> edges; vector<int> G[maxn]; int a[maxn]; int p[maxn]; int d[maxn]; int inq[maxn]; void init(int n){ this->n=n...原创 2020-02-21 23:25:56 · 97 阅读 · 0 评论 -
Admiral UVA - 1658
问题分析还是构图,为了让两条路径没有公共点,所以将除了1,v外的其他点拆分成两个点,一个点上连接原来的入弧,另一个点连接出弧,然后两个点之间连接一条容量1,费用为0的边,这样就能够保证只有1个流量经过这个点,如果两个流量在此点重合,那么一定有一个不能出去,所以可以使用最大流最小费用算法求解在这里插入代码片...原创 2020-02-21 21:23:37 · 136 阅读 · 0 评论 -
Matrix Decompressing UVA - 11082
问题分析主要是思想首先算出矩阵的行和和列和,在对它们做减法,将每个元素的区间从[1,20]变为[0,19],算出对应的行和和列和,然后将每行抽象成一个点X_i,每列抽象成一个点Y_j,添加源点和宿点,连接源点和每个X_i,容量是对应的行和,连接每个Y_j和宿点,容量是列和,然后哦X_i和Y_j之间全连接,容量是19,求源点,宿点之间的最大流,流经X_i,Y_j之间的流量就是矩阵中i行j列的值...原创 2020-02-21 16:49:37 · 76 阅读 · 0 评论 -
A Plug for UNIX UVA - 753
问题分析添加两个节点,一个源节点,一个宿节点解法1:首先用floyd算出所有的转换器之间的连接关系,然后将插头和插座看作点,转换器作为边,容量是INF,连接源点和每个插头,每个插座和宿节点,容量是1,计算最大流量解法2:不适用Floyd,直接构图,每个出现过的插头或者插座都看作一个节点,将转换器看作边,容量INF,添加源节点,宿节点解法1:EK ://// Created by Z...原创 2020-02-21 12:08:01 · 137 阅读 · 0 评论 -
Dinic算法模板 EdmondsKarp模板
EdmondsKarp模板struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};struct EdmondsKarp{ int n,m; vector<Edge> edges; vector<i...原创 2020-02-20 23:53:36 · 105 阅读 · 0 评论 -
网络流问题 最大流 增广路算法 最小割最大流定理 最小费用最大流
网络流问题网络流是一类关于图中(一般是有向图)的的流的问题。最大流问题和增广路算法增广路算法是用来求解最大流问题的算法,算法的思想就是:从0开始不断寻找增广路,然后反向增加流量,最终不能增加流量是停止算法...原创 2020-02-19 18:18:32 · 419 阅读 · 0 评论 -
It's not a Bug, it's a Feature! UVA - 658
问题分析一开还以为是可以用动态规划或者floyd相似的思想求解,读了紫书的解答后才发现如果化成图,那么是一个有环的图,所以不能使用记忆化搜索动态规划,会出现无限递归(使用线性动态规划),而且如果使用递推也开不下那么大的空间(使用二维数组)。把状态看成点,状态转移看成边,转化为最短路问题。使用隐式图搜索:因为图太大了,所以不预先建图,而是到了状态u,再枚举m个补丁,看看是否能用。#incl...原创 2020-02-18 22:53:12 · 139 阅读 · 0 评论 -
Audiophobia UVA - 10048
问题分析直接用floyd算法,简单调整一下g[i][j]=min(g[i][j],max(g[i][k],g[k][j]))注意: 节点是从1开始编号的,不是0#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <...原创 2020-02-18 20:04:26 · 98 阅读 · 0 评论 -
Calling Circles UVA - 247
问题分析就是有向图的传递闭包,floyd算法判断u能否连到v,v能否连到u注意,要在case中间加空行,最后一个case后面不能有空行#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#inc...原创 2020-02-18 17:22:09 · 76 阅读 · 0 评论 -
最短路算法 dijkstra bellman-ford还有Floyd
最短路算法最短路算法主要有dijkstra bellman-ford还有Floyd三种dijkstra算法计算边权为正的单源最短路。同时适用于有向图和无向图bellman-ford算法floyd算法...原创 2020-02-18 15:47:27 · 231 阅读 · 0 评论 -
Buy or Build UVA - 1151
问题分析可以暴力求解,枚举可以购买的套餐组合,然后再kruskal算法,其中将套餐的边提前连通,权重视为0,再连通剩下的边#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include &l...原创 2020-02-17 21:25:13 · 107 阅读 · 0 评论 -
Slim Span UVA - 1395
问题分析先将边从小打大排序,然后固定right,选择合适的最大left,是的区间内的边可以练成一个生成树,计算苗条度思想和kruskal算法相似,都是基于贪心的思想#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <algor...原创 2020-02-17 16:57:07 · 82 阅读 · 0 评论 -
最小生成树 使用并查集的kruskal算法 使用优先队列的prim算法
最小生成树无向图中,不含圈的连通图叫做树。连接G中的所有点,且边集是E的子集的树称作G的生成树,权值最小的生成树叫做最小生成树(Minimal Spanning Tree,MST)。构造MST的算法很多,其中最常用的有两个:Kruskal算法和Prim算法Kruskal算法Kruskal算法的第一步是将所有的边按照权重从小到达排序,这一步可以直接使用qsort或者sort函数。接下来从小到大...原创 2020-02-17 15:06:52 · 300 阅读 · 1 评论 -
Common Subexpression Elimination UVA - 12219
问题分析就是建树,然后使用map和数组将子树映射成编号用一个数据结构存储树,只保存子树的编号和自己的hash,string,然后就可唯一确定自己的编号注意: 不能让a对应0tnode.hash=tnode.hash*27+(*ptr-‘a’+1);// 区分aaa和a#include <iostream>#include <cstdio>#include &...原创 2020-02-16 23:49:31 · 108 阅读 · 0 评论 -
无根树转化为有根树 表达式树
树的存储有时候节点数量很多,使用二维数组开不下,可以使用vector数组,空间大小是O(n)大小vector<int> G[maxn];void read_tree(){ int u,v; scanf("%d",&n); for(int i=0;i<n-1;++i){ scanf("%d%d",&u,&v); G[u].push_bac...原创 2020-02-16 19:23:58 · 331 阅读 · 0 评论