![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
紫书-第11章-图论模型与算法
文章平均质量分 80
冷月残星
这个作者很懒,什么都没留下…
展开
-
最小费最大流,最小权最大匹配,拆点法(最优巴士路线设计 uva 1349)
紫书网络流上的题目,上面的题目简述与分析挺清楚。给n各点(n每个点恰好属于一个圈,意味着每个点都有一个唯一的后继。反过来,只要每个点都有唯一的后继,每个点一定恰好属于一个圈。“每个东西恰好有唯一的……”让我们想到了二分图匹配。把每个点i拆成Xi和Yi,原图中的有向边u->v对应二分图中的边Xu->Yv,则题目转化为了这个二分图上的最小权完美匹配问题。Xi就像每个点的尾巴,Yi就原创 2016-07-13 23:15:27 · 2103 阅读 · 0 评论 -
最小生成树(星际游击队,uva 1279)
真的醉了。。。写了好久,然后WA。万念俱灰,抱着搞笑的心态改了一行代码,决定WA一发然后睡觉去。。改的是这个typedef long long ll;改成typedef double ll;然后交了,准备放弃。。然后AC了。。。当时就是觉得会不会long long不够大啊改成double虽然精度更低了但是能表示的数更大了,而且在数极大的情况下原创 2016-08-06 00:34:00 · 634 阅读 · 0 评论 -
最大费用循环流(帮助小罗拉,uva 1659)
用紫书上的第一种方法做的。本来要找环使得分最大(即最大费用循环流),为了用最小费用流建模,就边权取反,然后找负环增广。(转换成最小费用循环流)以下下有两个要点:1、循环流没有最大流这个说法事实上在算法运行时也只是找负圈,然后就对负圈进行增广,不存在源点与汇点,也不会对s-t进行增广,也就不会有所谓的最大流。但其实算法运行完毕后是能够算出一个flow来的,这个flow叫啥我也不知原创 2016-08-06 21:02:40 · 2226 阅读 · 0 评论 -
最大流,最小割(水塘,uva 1515)
最大流是由最小割决定的,一个木桶能装多少水是由最短的那块木板决定的,一条路单位时间最多能通过多少辆车是由最窄的那个路口决定的。http://blog.csdn.net/jijijix/article/details/51941014盗个图http://www.cnblogs.com/jerryRey/p/4761919.html一些参考容量表示断开这条弧的费用。转载 2016-08-01 23:28:52 · 439 阅读 · 0 评论 -
Floyd,传递闭包,并查集(电话圈,uva 247)
n个人(nn很小,建一个邻接矩阵,MAP[i][j]表示编号为i的人给编号为j的人打过电话。跑一遍Floyd求出传递闭包。最后用并查集去分组。紫书有另一个分组的方法,那就是新建一个图,同一电话圈内的人互连一条边,然后一次输出各个连通分量的所有人。附上代码#include#include#include#include#include#inc原创 2016-07-17 20:17:28 · 438 阅读 · 0 评论 -
最小生成树,Kruskal(买还是建 uva 1151)
用并查集合并集合时,不能直接p[net[t][i]]=net[t][1];而要int u=net[t][i];int v=net[t][1];int xx=find(u);int yy=find(v);if(xx!=yy) p[xx]=yy;附上代码#include#include#include#defin原创 2016-07-17 15:21:31 · 406 阅读 · 0 评论 -
最小生成树(苗条生成树 uva 1395)
#include#include#define maxn 10010#define INF 0X3F3F3F3Fusing namespace std;int u[maxn],v[maxn],w[maxn],p[maxn],r[maxn];int n,m;int cmp(const int i,const int j){return w[i]<w[j];}int find(in原创 2016-07-17 02:37:36 · 417 阅读 · 1 评论 -
表达式树(公共表达式消除 uva 12219)
一共写了3遍,2遍超时,第三遍看了别人的代码才写出来的。。。第一遍,直接保存整颗子树,也就是整个子表达式。为了得到子表达式的值,我频繁调用substr函数。为了找到分隔左右子表达式的逗号,我直接遍历子表达式。最后用map去映射。结果超时。。后来看了下紫书,说不能保存整颗子树。。说比较两棵树的时间复杂度是O(n),循环枚举两颗子树,总时间复杂度高达O(n^3)。转载 2016-07-17 00:32:51 · 1741 阅读 · 0 评论 -
最大流(矩阵解压 uva 11082)
给一个R行N列的矩阵(1for(int i=R;i>=1;i--) A[i]=A[i]-A[i-1];for(int j=C;j>=1;j--) B[j]=B[j]-B[j-1];可以得到第i行或第j列所有元素之和。建立一个二分图,每行对应一个X节点,每列对应一个Y节点,然后增加源点s和汇点t。对于每个Xi,从s到Xi连一条弧,容量为A[i]-C;对于每个Y原创 2016-07-14 20:14:55 · 879 阅读 · 0 评论 -
最大流,二分法,拆点法(士兵移动 uva 12264)
给n个点的无权无向图(n0则此点归你且上面有ai个属于你的士兵。保证至少有一个属于你的点与敌方的点相邻。你可以让你的每个士兵最多移动一次,每次可以待在原地或者去到相邻的属于你的领地,但每个点至少要留1各士兵,使得最薄弱的关口尽量坚固。关口是指与敌方点相邻的点,薄弱与坚固分别指兵少与兵多。我参考了这篇博客上的一些讲解。http://www.voidcn.com/blog/a197p/ar转载 2016-07-14 00:27:25 · 1864 阅读 · 1 评论 -
最小费最大流,拆点法(海军上将 uva 1658)
有向加权图,从1到v找两条不相交路径,使权值和最小。通过拆点法使得两条路径没有公共点(不相交)。把2到v-1的每个节点拆成i和i’两个节点,中间连一条容量为1,费用为0的边。如下图,图1为拆点前,图2为拆点后,每条边的容量为1。显然图1可能成为两条路径相交处。图2两点间边的容量为1,使得最多只能有一条路径穿过此点。附上渣代码#include#inc原创 2016-07-14 01:38:27 · 785 阅读 · 0 评论 -
最大流,Floyd(UNIX插头 uva 753)
给n个插座,m个设备和k种转换器(n,m,k一开始跟着紫书上的提示做的。每个设备连到源点,容量为1。每个插座连到汇点,容量为1。转换器有无限多而且一个设备的插头可以经过任意多的转换器后再插入插座中。因此我们不需要知道转换的过程,只需要知道某个设备的插头类型最后是否能转换成某个插座的类型即可。因此建立一个转换器的有向图,类型为点,转换器为有向边。然后通过Floyd算法得到此图的闭原创 2016-07-14 14:12:48 · 749 阅读 · 0 评论 -
最大流,欧拉回路(混合图的欧拉回路,uva 10735)
关于欧拉图http://blog.csdn.net/y990041769/article/details/9371591一些参考http://www.hardbird.net/uva-10735-euler-circuit%E6%B7%B7%E5%90%88%E5%9B%BE%E7%9A%84%E6%AC%A7%E6%8B%89%E5%9B%9E%E8%B7%AF/找的是欧拉回路而转载 2016-08-05 19:36:27 · 709 阅读 · 0 评论