摘要:Description给你一个n*n的格子的棋盘,每个格子里面有一个非负数。从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。解题思路分析下题目的一些关键的特点:首先此题最大特点就是一个点只和周围4个点有关联,简单的说就是可以通过一个奇偶染色构造二分图(为么么?),在假设如果每个的点权都为1,那此题就可以转换成最大独立集。那现在这是个什么问题呢?其实这是一个二分图最大点权独立集问题,就是找出图中一些点,使得这些点之间没有边相连,这些点的权值之和最大。独立集与覆盖集是互补的,求最大点权独立集可以转化为求最小点权覆盖集(最小点权支配
阅读全文
摘要:如果HDU 1569 3657没做的,先做做那两题吧。这题是个升级版。对原矩阵黑白染色1 2 34 5 67 8 9A={1,3,5,7,9}B={2,4,6,8}矩阵中每个点可以取两个值中的任意一个,或者都不取。根据这一个条件,我们可以把一个点拆分成两部分,k,k'。对A集合中的点,k为金蛋,k'为银蛋。B集合中的点,k为银蛋,k'为金蛋。k->k’连一条容量为inf的边,这样就可以保证k,k'只取其中一个,或者都不取。从S到k,从k'到T 分别连一条容量为其价值的边。对A中的金蛋k,向B中的金蛋k'连一条容量为G的边。对B中的银蛋k,向
阅读全文
摘要:最小割建模添加源S和汇T,对每个组件,由S向其连一条边权代表在A处购买其所用的花费的边. 由组件向T连一条边权为在B处购买其所用的花费的边. 其他由于不兼容造成的花费就在两个发生不兼容性质的组件之间连双向边,边权为花费.
阅读全文
摘要:最小割建模:源点与1连容量为无穷的边,每对有向边之间连边,容量为权值,然后每个可以拥有的城市向汇点连边,容量为价值答案即为所有可拥有城市的价值-最小割
阅读全文
摘要:正向Dijkstra和反向Dijkstra一次,分别求出点1到i和i到点n的距离 dist[i]和_dist[i],对于某个点若dist[i]+_dist[i]>K的话,则说明这个点可以从图中删去,因为流量经过点i都不可能在k步内流到汇点,所以这个点在最大流过程中是没有任何意义的,所以删掉,而构建出的新图便是普通的求割点
阅读全文
摘要:题意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为40km/h。现在你知道了出发地和终点的坐标,以及这些地铁线路每个站点的坐标,你的步行速度为10km/h,且你到了地铁的任意一个站之后就刚好有地铁出发。问你从出发点到终点最少需要多少时间。思路:dijkstra。构图:把起点,终点,以及每个地铁站作为一个图的所有顶点,所有顶点i和j两两之间,均有边权为w = dis/ 10 (km/h) 的边相连,之外,任意地铁线路的任意两个相邻的站点,均有边权为w = dis/ 40 (km/h)的边相连。然后就是求最短路径了。代码:#include<iostream
阅读全文
摘要:费用流,数据很水。代码:#include<iostream>#include<fstream>using namespace std;#define oo 10000000typedef struct e{ int data; e *next,*opt; int c,cost; }e;e edge[5003];int n,m;int v[5003],d[5003];int path[5003];e *path1[5003];int spfa(){ int queue[5005],i,j,k; memset(v,0,sizeof(v)); for(i=0;i<=n*
阅读全文
摘要:最小点权覆盖。注意入边,出边不要搞反了。代码:#include<iostream>#include<fstream>#include<queue>using namespace std;int n;int d[210];int flow;int v[210];typedef struct e{ int data; int f,c; e *next,*opt;}e;e edge[210];int build(){ int i,j,k; queue<int> q; q.push(1); memset(d,0,sizeof(d)); d[1]=1; w
阅读全文
摘要:二分图最小点权覆盖。代码:#include<iostream>#include<fstream>#include<queue>#include<cmath>using namespace std;int n;int d[110];double flow;int v[110];typedef struct e{ int data; double f,c; e *next,*opt;}e;e edge[110];int build(){ int i,j,k; queue<int> q; q.push(1); memset(d,0,size
阅读全文
摘要:最小割。二分方法中: while(begin<=end) { mid=(begin+end)>>1; build(mid); if(m*xx-solve()>0) begin=mid+1; else end=mid-1; }最后 end<ans*<=begin.最大权值为begin,但要求定点集,要用end。代码:#include<iostream>#include<fstream>#include<queue>#define xx 1000000using namespace std;int n;int c[1110][
阅读全文
摘要:有上下界的网络流,非主流做法。#include<iostream>#include<fstream>#include<queue>using namespace std;int n;int c[250][250],pre[250],f[250][250];int d[250],flow;int v[250];typedef struct e{ int data; e *next;}e;e edge[250];int build(){ int i,j,k; queue<int> q; q.push(1); memset(d,0,sizeof(d))
阅读全文
摘要:网络流,重在建图(注意重边)。代码:#include<iostream>#include<fstream>#include<queue>using namespace std;int n;int c[105][105],pre[105],f[105][105];int d[105],flow;int v[105];typedef struct e{ int data; e *next;}e;e edge[105];int build(){ int i,j,k; queue<int> q; q.push(1); memset(d,0,sizeof(
阅读全文