09 2011 档案
POJ2455 Secret Milking Machine 典型二分答案+最大流判定
摘要:表示被这道题整得辛苦。刚开始是P=40005写成了P=4005。wa了无数次之后才发现是这个问题。然后是tle。因为刚开始因为最大流做题惯性有邻接表来存储。一直tle好久。然后再恍然大悟要用邻接矩阵。思路其实挺简单:有典型套路可做。这题很明显就是要“最短路”,但是这里的最短路是最长的权值最短,不是精确意义上的最短路。然后再有一个约束就是要求出好几条不重叠的“最短路”,不重叠!套路是用二分+最大流来做,将边得权值都设为1。如果重边则1+1=2,再重则3。挺典型的。#include<iostream> #include<algorithm> #define MIN(a,b) 阅读全文
posted @ 2011-09-30 23:42 不是我干的 阅读(379) 评论(0) 推荐(0)
POJ3308 Paratroopers 最大流最小割
摘要:题意很显然,但是要注意product是有乘积的意思,即这次比较特殊的是不是求权值和最小,而是权值积最小。思路:1.权值积最小记得要用对数来处理。2.熟悉二分图最大匹配的就可以看出其实这题是个二分图最小权值点覆盖。二分图的X是行,Y是列,如果有伞兵(i,j)即有响应的x集合的点到y集合的点的边。幸运的是,这些边没有权值,(即在下面构造的在流网络中权值为inf)。但不能因此直接用最大匹配算法。因为每个点有权值。3.所以这里要用到最大流最小割的原理,设定源点和汇点。源点连接X集合的每个点的边的权值为X集合每个点的权值,同理汇点连接Y集合。这样就转化为一个典型的流网络。下面是代码,但是一直wa,可能是 阅读全文
posted @ 2011-09-30 13:35 不是我干的 阅读(224) 评论(0) 推荐(0)
POJ3204 Ikki's Story I - Road Reconstruction 最大流
摘要:我觉得算是比较简单的最大流了吧。主要是要理解清楚题意。题意:一个有向图,源点汇点已经确定,有向边已经知道,要求出增加某单条边得权值可以使最大流增加的单条边的个数。思路:其实使最大流增加这个条件就相当于寻找增广路径。先一边最大流处理过去。然后枚举每条饱和的单向边(此时权值为0),使其权值+1,如果bfs()返回true,即找得到增广路径。即这条边满足题意,即ans++。这样既可。#include<iostream> using namespace std; const int N=505,M=5005; const int inf=1<<29; int n,m; stru 阅读全文
posted @ 2011-09-29 20:54 不是我干的 阅读(360) 评论(0) 推荐(0)
POJ2391 Ombrophobic Bovines 二分+最大流dinic
摘要://floyd+二分答案+最大流判断 //但是一直wa,改天再详细查查原因。 //后来查出来是构图原因,修改的地方已经在注释中。 //现在AC了。 //我觉得代码写得还算容易看懂吧。 #include<iostream> using namespace std; #define MIN(a,b) (a<b?a:b) const int N=205; int n,m; int cow[N],shelt[N]; long long mat[N][N]; const int inf=1<<29; const long long INF=1ll<<59; st 阅读全文
posted @ 2011-09-28 23:11 不是我干的 阅读(572) 评论(0) 推荐(0)
poj3228 Gold Transportation 并查集
摘要:poj3228 Gold Transportation思路是并查集。并查集是在学习最小生成树kruskal算法的时候学习的。印象比较深。kruskal是从边的角度进行的得一种贪心算法。现在这道题其实很类似最小生成树kruskal算法,但是并它要简单得多。因为我们只需要满足最大值最小。而不需要满足总体最小。具体为:将1~n个town抽象为单个节点。然后对m条边进行从小到大排序。然后从小到大读取每条边的两个节点,并查集处理之。直到所有gold可以被运输完。一次AC。Source Code Problem: 3228 User: 64162451 Memory: 380K Time: 16M... 阅读全文
posted @ 2011-09-26 23:04 不是我干的 阅读(164) 评论(0) 推荐(0)
POJ3189 Steady Cow Assignment 二分枚举+dinic最大流
摘要:但是不幸的是,一直超时。查不出来是不是我哪写错了。还是难道非得sap?#include<iostream> using namespace std; #define MIN(a,b) (a<b?a:b) #define MAX(a,b) (a>b?a:b) const int N=1005; const int B=25; int n,b; const int inf=99999999; struct Edge { int v,next,w,re; }edge[N*B*2+N*2+4]; int edgehead[N+B]; int k=1; int mat[N][B] 阅读全文
posted @ 2011-09-26 18:04 不是我干的 阅读(192) 评论(0) 推荐(0)
POJ2028 When Can We Meet? 水题
摘要:因为小学期的任务隔了不少时间没碰算法了。晚上很想a道网络流的题目,纠结了好久,实在不行。实在郁闷。无奈。搜了个大水题来做。这题实在水,能看得懂题意的都能做了吧。#include<iostream> using namespace std; const int N=55; int n,m; int Hash[101]; int main() { freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin); while(scanf("%d%d",&n,&m 阅读全文
posted @ 2011-09-25 22:34 不是我干的 阅读(215) 评论(0) 推荐(0)
网络流sap算法模板及分析
摘要:网络流sap算法模板及分析 zz http://www.cnblogs.com/littlex/archive/2011/08/13/2137568.html typedef struct node{ int v, w; struct node *nxt, *op; }NODE; NODE edg[MM]; // 保存所有的边 NODE *link[NN]; // 记录节点所在链表的首节点 int h[NN]; // 距离标号,记录每个点到汇点的距离,这里的距离指的是层数 int num[NN]; // gap优化,标号为i的顶点个数 int M... 阅读全文
posted @ 2011-09-25 20:17 不是我干的 阅读(205) 评论(0) 推荐(0)
POJ2516 Minimum Cost 最大流最小费用典型题目
摘要:刚接触spfa算法。我的理解是spfa算法实质是bellman算法的改进版,可以处理负值,这是和dij的本质区别,也是这里不能用dij的原因。spfa算法的队列的大小一定要注意!开小了悲情无限。而最大流最小费用的思路说简单了就是最大流的实现时,以前没有最小费用这个约束的时候,我们很随意的可以直接用bfs来搜索增广路径来解最大流。但此时有最小费用这个约束。我们用最短路来搜索增广路径。这样来求得的最大流则满足题意。#include<iostream>using namespace std;int n,m,k;const int inf=9999999;const int N=111;i 阅读全文
posted @ 2011-09-19 22:40 不是我干的 阅读(225) 评论(0) 推荐(0)
Spfa算法 (模板源代码)
摘要:zzhttp://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.htmlSpfa算法 (模板源代码) 这是Bellman Ford的改进算法。 算法介绍:建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。 时间复杂度:期望的时间复杂度O(ke), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2。 通用模板设计(源代码... 阅读全文
posted @ 2011-09-16 15:59 不是我干的 阅读(3180) 评论(0) 推荐(0)
POJ3469 Dual Core CPU 最大流dinic
摘要:题意:双核电脑处理任务。每个任务在每个核中处理的cost已知,并且已知如果某两个任务在不同核时的extra cost。思路:最大流最小割。难点在于构图。构图时,把核A作为源点,把核B作为汇点。任务作为中间节点。cost作为单向边。特别地,对于“如果某两个任务在不同核时的extra cost。”作为两个任务的双向边。这样构成的图用dinic求最大流。结果则是答案。不得不感慨最大流真是好用。#include<iostream> #include<string> using namespace std; const int N=20015,M=200015; const in 阅读全文
posted @ 2011-09-14 19:31 不是我干的 阅读(273) 评论(0) 推荐(0)
图论网络流 Dinic算法和模板
摘要:zzhttp://blog.sina.com.cn/s/blog_61533c9b0100iawn.htmlDinic算法是基于分层思想的网络流算法,它的的效率一般比E-K算法高算法的思想:Dinic是在分阶段地在层次图中增广。它与最短路径增值算法不同之处是:在Dinic算法中,我们用一个dfs过程代替多次bfs来寻找阻塞流。下面给出其算法步骤:1、初始化流量,计算出剩余图 2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束 3、在层次图内用一次dfs过程增广 4、转步骤2算法模板://时间复杂度O(V^2E) #include<iostream>#define Max 21 阅读全文
posted @ 2011-09-14 17:35 不是我干的 阅读(987) 评论(0) 推荐(0)
POJ2584 T-Shirt Gumbo 最大流
摘要:算是最大流基础题了吧。构图:多出一个源点start,一个汇点final源点到5个衣服的边权值是每个衣服的数量数。然后每个衣服到匹配的人的边权值都是1,然后每个人到汇点的边权值都是1.这样最大流一下,其实就是用最大流求最大匹配。#include<iostream> #include<queue> using namespace std; const int N=200; const int M=2000; char range[N][2]; bool visit[N]; int pre[N]; int k=1; int start; int final; int n; c 阅读全文
posted @ 2011-09-07 19:33 不是我干的 阅读(150) 评论(0) 推荐(0)
POJ3281 Dining 最大流 邻接表[模板]
摘要:不错的构图题。思路:和一般的最大流图论题一样,难点在构图上。刚开始有点想用二分,但其实不用什么二分匹配,有二分的思想即可,把cow二分成两批。即一个点拆成相连的两个点。然后左边是food的点,右边是drink的点。具体看图一目了然。#include<iostream>#include<queue>#include<algorithm>using namespace std;const int N=405;const int M=100000;int n,f,d;int edgehead[N];int k=1;bool visit[N];int pre[N]; 阅读全文
posted @ 2011-09-06 22:05 不是我干的 阅读(136) 评论(0) 推荐(0)
POJ 3522 Slim Span kruskal+枚举。
摘要:是道不错的题目。最瘦生成树的定义:最长边和最短边之差最小的一棵生成树。思路是kruskal+枚举算法。这题让我明白枚举的角度选择问题真是有学问。刚开始一直没想明白要怎么枚举。后来参考了别人,枚举直接枚举最小生成树的最小边即可。求最小生成树时,我们用sort把边都排序了一边。注意:最小生成树求解过程是一种贪心算法。每次都选最短的边!故sort后我们从小到大枚举最小边。这样,当最小边确定后,用kruskal算法,它自动会生成一棵最小树,这棵最小树肯定是最小边已确定的最大边为最小的树。故枚举最小边这个算法是正确的。总而言之。要好好理解kruskal的贪心思想。#include<iostream 阅读全文
posted @ 2011-09-06 16:35 不是我干的 阅读(199) 评论(0) 推荐(0)