
网络流
文章平均质量分 68
Benzema67
北京邮电大学学生
展开
-
POJ 2391
求最大值最小问题通常都是用二分.#include#include#include#define min(a,b) ((a)>(b))?(b):(a)#define inf 1000100000#define INF (~(0ULL)) >>1using namespace std;int N,n,m;long long map[205][205];int in[205],ou原创 2012-03-04 11:10:12 · 990 阅读 · 0 评论 -
POJ 3469
用了一年的SAP模板T了,学习了一下非递归的写法SAP算法的核心:维护距离标号的方法是这样的:当找增广路过程中发现某点出发没有允许弧时,将这个点的距离标号设为由它出发的所有弧的终点的距离标号的最小值加一。这种维护距离标号的方法的正确性我就不证了。由于距离标号的存在,由于“怎么走都是最短路”,所以就可以采用DFS找增广路,用一个栈保存当前路径的弧即可。当某个点的距离标号被改变时,栈中指向原创 2012-09-29 20:52:06 · 939 阅读 · 0 评论 -
HDU 4406
费用流建图还是比较简单的。。。(参见下面代码)#include#include#include#define N 100#define inf 100000000using namespace std;int cre[N],tot_cre;int sco[N];int head[N],cnt,dis[N],pre[N],vis[N],ans[N];int n;s原创 2012-10-02 13:35:52 · 1669 阅读 · 0 评论 -
POJ 3680
建图很巧妙先离散化区间端点。从0->1,1->2,~~~~~n->n+1每条边容量为k,费用为0,对于每条线段,他的两个端点连边容量为1,费用-w然后跑一遍最小费用流算法正确性证明:如果两个区间没有交集,那么代表它们的边可以出现在同一增广路上,这一点显然。否则,它们就在不同的增广路上。每一个区间对应的边的容量都是1,这样,最后的流量就是被选出的两两有交集的区间的数量。受到(0,原创 2012-03-21 18:11:33 · 2163 阅读 · 0 评论 -
HDU 4106 Fruit Ninja
这个考费用流建图(时间跑到HDU目前的第四)是poj3680的加强版poj 3680 是区间对点的限制,而这道题,是点对区间的限制。如果选取取一个数,那么每个包含这个数且长度为 M的连续区间内可以选的数都要减少一个,对吧?转换模型!点变区间,区间变点!把区间离散化为 n - m + 1个部分,那么就有 n - m + 2 个点,left = max(1,i-m+1) ;right =原创 2012-03-23 00:23:14 · 1942 阅读 · 0 评论 -
HDU 4067
费用流混合欧拉回路#include#include#include#define N 300#define inf 100000000using namespace std;typedef long long ll;int n,cnt;int head[N],pre[N],vis[N],in[N],out[N];int dis[N];int ans,sum,suma原创 2012-10-01 19:40:14 · 1202 阅读 · 0 评论 -
spoj 371
最小费用流水之#include#include#include#define N 1010#define inf 100000000using namespace std;int n,cnt;int head[N],pre[N],vis[N];int dis[N];int ans;struct Edge{ int u,v,c,next; int w;}ed原创 2012-10-07 17:31:25 · 905 阅读 · 0 评论 -
HDU 2435
最小割性质#include#include#include#define N 110#define M 10100#define inf 10000000using namespace std;int n,k,dis[N],head[N],gap[N],f[N]; //n为点数int a[M*2];struct Edge{ int v,c,next;}edge[M原创 2012-10-11 16:43:07 · 1105 阅读 · 2 评论 -
HDU 3657
本题是HDU 1565的加强版题目描述:n*m的矩阵,每个位置都有一个正数,一开始你的分数是0,当你取走一个数字时,你的分数增加那个分数。如果你取完数字后,新出现了2个相邻的都是空的格子,那么你的分数减少2* ( x & y),x,y是那两个格子的原始数值。同时有一些附加条件,有一些格子的数字是必须拿走的。解题报告:首先,这种相邻格子的问题都会想到它是一个二分图:横纵坐原创 2012-10-23 13:08:13 · 822 阅读 · 0 评论 -
HDU 4411
费用流建图见下面代码,解释下这条加边addedge(2*v+1,2*v+2,k,0);费用流第一遍跑肯定是跑含有v条负无穷的边。如果以后跑反向边是对第一次跑n条负无穷的边的优化,如果没有优化就干脆不出动警力#include#include#include#define N 300#define inf -100000000using namespa原创 2012-10-01 16:31:40 · 1237 阅读 · 0 评论 -
KM模板
O(n^3)的复杂度,解决最佳完备匹配问题。#include #include using namespace std;const int maxn=160,OO=(~(0U))>>1;int w[maxn][maxn];int lx[maxn],ly[maxn];int linky[maxn];int visx[maxn],visy[maxn];int N;int s原创 2013-04-05 18:28:26 · 1128 阅读 · 0 评论 -
ZOJ 2342
首先,最优的方案里,我们是不会增加石头路的费用的,也不可能去降低烂泥路的费用,所以可以认为对石头路有d=c-l,对烂泥路有d=c+l,l>=0。生成树加上原图一条边,一定构成一个圈;而最小生成树加上原图一条边,不但构成圈,而且有新加上边的权值一定不比圈中其余边的权值小,否则我们就可以得到了一个更小的生成树。利用这个性质,对于每个圈,都可以构造一些列不等式,假设i是石头路,而j是烂泥路,就有dij,原创 2013-04-05 20:32:13 · 1534 阅读 · 0 评论 -
sgu 185 Two shortest 最大流
这道题思路就是由最短路边组成的边集搞一次最大流得到的是互不相交的路径。首先用SPFA得到各点到源点的最短距离,在遍历一遍所有的边,通过判断是否满足dis[u]+map[u][v]==dis[v]来判断是否在最短路边集上。然后用SAP求一下从1到n的最大流,如果小于2则no solution。否则dfs2次打印路径。#include#include#include#includ原创 2012-01-20 23:48:13 · 1038 阅读 · 0 评论 -
poj 2446
简单二分图匹配#include#include#define con 1100int m,n,p; //m=row,n=colint map[con][con];int cx[con],cy[con];bool mk[con];bool is[33][33];int path(int u){ int i; for(i=0;i<m*n;i++){ if原创 2012-07-05 16:15:04 · 915 阅读 · 0 评论 -
POJ 3436 ACM Computer Factory
简单最大流,拆点做。模板敲错WA了好几次#include#include#define inf 1000000#define min(a,b) ((a)>(b))?(b):(a)using namespace std;int num[60],in[60][11],out[60][11];int n,k,dist[200],gap[200],edgeHead[200];//双向边s原创 2012-03-05 23:16:06 · 745 阅读 · 0 评论 -
POJ 1637 Sightseeing tour
混合图欧拉回路判断(不会的可以看看刘汝佳的黑书)基础知识 欧拉回路是图G中的一个回路,经过每条边有且仅一次,称该回路为欧拉回路。具有欧拉回路的图称为欧拉图,简称E图。 无向图中存在欧拉回路的条件:每个点的度数均为偶数。 有向图中存在欧拉回路的条件:每个点的入度=出度。 欧拉路径比欧拉回路要求少一点: 无向图中存在欧拉路径的条原创 2012-03-07 15:17:50 · 616 阅读 · 0 评论 -
ZOJ 2587 Unique Attack
题意:判断最小割是否唯一。思路(转):判断最小割是否唯一,先求一次最大流,然后在残留网络中分别从源汇开始dfs一次,找出最小割[S,T],如果SUT不包含所有点,那么最小割不唯一。假设点i不被SUT包含,那么残留网络中s不能到达i,i不能到达t,即进入i的边和从i出去的边都满流,假设某条进入i的边x满流,这些流量从若干条边y流出i,那么,如果选x为割边,或者选所有对应的y为割边,不会影响最大流原创 2012-03-07 16:57:42 · 775 阅读 · 0 评论 -
ZOJ 2788 Panic Room
最小割问题。设一个超级源点s,s向每个有入侵者的房间连一条容量为inf的边.然后对于两个房间的门(a,b),如果把手在a,连一条从a到b容量为inf的边,连一条从b到a容量为1的边。求一遍从s到被保护房间的最大流即可#include#include#include#define inf 1000000#define min(a,b) ((a)>(b))?(b):(a)using原创 2012-03-07 17:43:29 · 1034 阅读 · 0 评论 -
最小割的一点理解
转自mjmjmtl大牛:一、基本问题:1.到底什么是割:原始点集为V,选出一些点集S使得s∈S,T=V-S,t∈T,则S到T的边为S到T割,记做[S,T]。2.什么是最小割:图中所有的割中,边权值和最小的割为最小割!3.割得容量容量和流量计算的区别:割[S,T]的容量为∑(边(u,v)的容量和),其中u∈S,∈T。也就是说割的容量不计算反向的边!!而流量为正向的和反向的代数和。转载 2012-03-07 20:52:27 · 15130 阅读 · 1 评论 -
BOJ 313 Candy
源向每个小孩连边,容量是该小孩的初始糖数; 每个小孩向汇连边,容量是糖的平均数; 每个小孩想相邻的格子各连一条边,容量是1. 把图建好就很简单了 #include#include#include#define inf 100000000#define min(a,b) ((a)>(b))?(b):(a)using namespace std;int a,b,map[原创 2012-03-08 23:53:41 · 980 阅读 · 0 评论 -
NOI 2009 植物大战僵尸
【问题描述】Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏。Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻。该款游戏包含多种不同的挑战系列,比如Protect Your Brain、Bowling等等。其中最为经典的,莫过于玩家通过控制Plants来防守Zombies的进攻,或者相反地由玩家通过控制Zombies对原创 2012-03-09 18:24:42 · 2153 阅读 · 0 评论 -
KM算法理解
转自http://www.byvoid.com/blog/match-km/[二分图带权匹配与最佳匹配]什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小。而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大或最小。二分图的带权匹配与最佳匹配不等价,也不互相包含。我们可以使用KM算法实现求二分图的最佳匹配。方法我不再原创 2012-03-19 21:13:09 · 7524 阅读 · 1 评论 -
POJ 2195 Going Home
二分图最佳完备匹配KM算法KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终成立。KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的原创 2012-03-09 23:20:36 · 764 阅读 · 0 评论 -
HDU 2444
主要是dfs染色判断奇圈+二分匹配#include#includeusing namespace std;int map[210][210],col[210];int n,m;int cx[210],cy[210];bool mk[210];bool dfs(int now){ int i; for(i=1;i<=n;i++) if(map[now][i]){ if原创 2012-05-12 12:20:21 · 1493 阅读 · 1 评论 -
poj 3692
裸的二分图匹配相关概念定理:1.独立集:任意两点都不相连的顶点的集合 2.定理:最大独立集=顶点数-最大匹配边数(二分图当然也成立)3.完全子图:任意两点都相连的顶点的集合(最大完全子图即最大团) 4.定理:最大团=原图补图的最大独立集所以根据第四条可以看出在二分图中最大团问题可以方便解决,但在一般图中为NP问题。#include#includeint g,b,原创 2012-07-05 15:04:40 · 1123 阅读 · 0 评论 -
HDU 4049
好题mark1. 图论方法(最大权闭合子图)#include #include #define min(a,b) ((a)<(b)?(a):(b)) const int N=1110;const int E=5000;const int oo=1000000000; int node,src,dest,ne;int head[N],work[N],Q[N],dist[N]原创 2014-10-22 17:09:23 · 1436 阅读 · 0 评论