- 博客(30)
- 资源 (1)
- 收藏
- 关注
原创 poj 3042 Grazing on the Run
这个题目原型应该是吃完所有的草丛的最小时间,现在变成了每个草丛被吃的时间和,貌似如果还是按照原来的dp方法dp[i][j]表示吃完i到j的草丛的花掉的时间的话,有两个因素会影响后面的决策,一个是花掉的时间,一个是吃掉的草丛的时间累加和。但是仔细观察这个问题会发现,第一个走的距离,会被计算n次,第二个走的距离,会被计算n-1次。如果我们把这个代价转移到该草丛上的话。那么dp[i][j]表示转移后
2013-10-31 23:51:32 1067
原创 hdu 4494 Teamwork 网络流
网上比较多的代码都是用费用流做的,但是这个题目简单的描述就是求最小路径覆盖,每个点覆盖的次数不是1了而已。简单修改求最小路径覆盖的方法即可,源点向顶点,顶点向汇点连的边都变成点需要被覆盖的次数即可。#include #include #include using namespace std;const int maxn=15e1+9,inf=1e9;int n,m;int su
2013-10-28 22:45:32 1016
原创 poj 2446 网络流
先黑白染色,然后每个覆盖必须覆盖一个黑点一个白点,那么就是一个二分图,一个覆盖就是一次匹配,那么就求一下最大匹配就好了。#include #include #include using namespace std;const int maxn=1100,inf=1e9;int n,m,k;int flag[35][35];int level[maxn],que[maxn];
2013-10-27 22:25:40 654
原创 poj 3308 Paratroopers 网络流
由于最后结果是相乘,所以先log一下,转化成想加。然后点做边,行,列做点。最小权覆盖。#include #include #include #include using namespace std;const int maxn=2e2+9;const double inf=1e20,epx=1e-4;int que[maxn],level[maxn];int head[
2013-10-27 21:45:44 728
原创 poj 3281 网络流
经典题目,拆点网络流。#include #include #include using namespace std;const int maxn=4e2+9,inf=1e9;int n,f,d;int level[maxn],que[maxn];int head[maxn],lon;struct{ int next,to,c;}e[maxn*maxn<<1];
2013-10-27 16:56:16 712
原创 poj 2699 The Maximum Number of Strong Kings 网络流
#include #include #include using namespace std;const int maxn=19;int a[maxn],e[70][70],flag[maxn];int n;void makegraph(){ memset(e,0,sizeof(e)); int ret=0; for(int i=1;i<=n;i++)
2013-10-27 16:37:30 794
原创 poj 2391 Ombrophobic Bovines 网络流
二分答案+网络流判定,一定得拆点。#include #include #include #include using namespace std;const int maxn=2e2+9,inf=1e9;long long d[maxn][maxn];int n,m,sum;int level[maxn<<1],que[maxn<<1];int head[maxn<<1],l
2013-10-27 16:29:08 713
原创 poj 1637 Sightseeing tour 网络流
经典题目,很多书上都有解答。首先得用一个结论,一个联通的有向图存在欧拉回路当且仅当每个点的入度等于出度。那么这个题目的做法就是先给无向边任意定向,然后源点向入度大于出度的点连边,出度大于入度的向汇点连边,网络流判断能不能使得最后每个点的入度都等于出度。#include #include #include using namespace std;const int maxn=
2013-10-27 12:19:40 763
原创 poj 2125 Destroying The Graph
最小点权覆盖加输出路径。#include #include #include using namespace std;const int maxn=3e3+9,inf=2e9;int in[maxn],out[maxn];int S,T,level[maxn],que[maxn];bool visit[maxn];int n,m;int head[maxn],lon;s
2013-10-26 21:06:17 676
原创 poj 3155 Hard Life 分数规划+最大权闭合图
这个就是完全按照论文中的做法来搞了,输出割边的时候就dfs判断一下在残余网络中该点是否可达汇点,不可达则是割边。当然这么做还有一个前提就是最大全闭合图是唯一的,所以不会存在不同的割边集。#include #include #include using namespace std;const int maxn=1e2+9,inf=1e9;const double epx=1e-
2013-10-25 23:54:27 913
原创 poj 3084 最小割
简单的求最小割 不知道为什么这么少人A#include #include #include #include using namespace std;const int maxn=30,inf=1e6;int n,m;int level[maxn],que[maxn];int head[maxn],lon;struct{ int next,to,c;}e[ma
2013-10-24 20:57:13 624
原创 poj 2396 Budget 有上下界的网络流
对上下界网络流的解法很多地方有,就不再叙述了,说说自己的理解,网络流的算法能解决分配的问题,而上下界网络流的不同在于下界必须流满,所以做法就是先用网络流算法把下界流满,然后转化成普通网络流算法解决。#include #include #include using namespace std;const int maxn=2e2+9,inf=1e9,N=10000,M=1000;i
2013-10-23 23:11:55 756
原创 poj 1815 Friendship 网络流
求最小割就没什么可说的了。关键是怎么判断一条边能不能成为割边,如果能够成为割边,那么做完最大流之后,起点肯定不能达到终点,否则这条边容量减小对最大流没有影响。那么怎么去掉这条边呢?反向压一次流。#include #include #include using namespace std;const int maxn=4e2+9,inf=1e7;int n,s,t;int d[m
2013-10-23 00:13:50 928
原创 poj 2992 Divisors 简单数论
统计出质因数的个数,然后乘一下就可以了。但是数据量非常巨大,预处理出连续段的质因数的个数。#include #include #include using namespace std;const int maxn=500;int cnt[maxn][maxn];int n,m;void cal(int t,int tmp){ int tt=t; for(
2013-10-22 20:12:32 882
原创 hdu 4427 Math Magic dp
长春现场赛的题目,dp[i][j][k]表示公倍数为i,和为j,用了k个数的方法数。但是状态太多,注意到只有m的约数的公倍数才有可能是m,那么可以预处理出m的所以约数,然后只遍历这些状态,再稍微优化一下常数就可以过了。#include #include #include #include #include using namespace std;const int maxn
2013-10-22 11:52:22 916
原创 poj 3680 Intervals 费用流
#include #include #include #include using namespace std;const int maxn=1e3+9,inf=1e8;int from[maxn],to[maxn],w[maxn],x[maxn];int head[maxn],lon;int dist[maxn],inque[maxn],que[1111111];int T,n
2013-10-20 23:42:46 975
原创 poj 2376 Cleaning Shifts 贪心
每次选择开头被覆盖的最大的值#include #include #include using namespace std;const int maxn=1e6+9;int dp[maxn];int main(){ int n,t; while(scanf("%d %d",&n,&t)!=EOF) { memset(dp,0,sizeof
2013-10-16 23:54:11 769
原创 poj 1639 Picnic Planning
有度限制的最小生成树。解法网上很多,就不再叙述了。#include #include #include using namespace std;const int maxn=1e2+9,inf=5e7;char a[maxn][maxn];int n,m,limit;int head[maxn],lon,visit[maxn],dist[maxn],distfrom[maxn
2013-10-15 22:14:39 707
原创 poj 1904 King's Quest tarjan求二分图的所有可选最大匹配边
因为是完美匹配,所以每个点都已经匹配了,那么如果要选择一条别的边,增光路的最后必定找到原来所匹配的点,加上匹配的边,那么就是一个环。所以可选边在一个强连通分量里。#include #include #include using namespace std;const int maxn=4e3+9;int mt[maxn];int low[maxn],dfn[maxn],inst
2013-10-12 23:45:09 798
原创 poj 2226 二分图匹配
这个题目容易想到dp,dfs,dp状态太多,dfs会tle。那么就只能往图论上面想了,注意到一个事实,任何一个格子只能被两个木板覆盖。而且是一个横着放的木板,一个竖着放的木板,那么所有横着的木板都看成x集合的点,竖着放的点都看成y集合的点。而格子看成边,那么这就是一个二分图求最小覆盖的问题了。上代码#include #include #include using namesp
2013-10-12 19:18:11 677
原创 hdu 4742 Pinball Game 3D 分治+树状数组
离散化x然后用树状数组解决,排序y然后分治解决,z在分治的时候排序解决。具体:先对y排序,solve(l,r)分成solve(l,mid),solve(mid+1,r), 然后因为是按照y排序,所以l,mid区间内的y值都小于mid+1,r。现在再对z排序,按照顺序以x做关键字插入到树状数组中,那么就可以一起解决l,mid对mid+1,r的影响。#include #include
2013-10-08 21:10:56 1191
原创 Codeforces Round #204 (Div. 1) C Jeff and Brackets dp+矩阵加速
比赛的时候没做出来,时间不够,我想到的方法是先求出dp[i][j]在前面有i个左括号的情况下填完n个括号后的最优解。后面的m次就可以用矩阵加速来做了。#include #include #include using namespace std;const int maxn=22;int n,m;int a[maxn],b[maxn];long long dp[maxn][
2013-10-08 10:37:10 1240
原创 poj 3714 Raid 分治
先按横坐标排序,然后分治,合并的时候只需要处理两边x坐标差在d范围内的点即可。把这些点找出来之后,再按照y值排序,然后再检查y坐标差在d以内的点,那么可以保证每个点最多检查6个点(否则这些点之间必定存在距离小于d的点对),那么可以保证o(n)的合并。总的复杂度nlognlogn。#include #include #include #include #include usi
2013-10-07 16:18:54 803
原创 hdu 4757 Tree 南京网络赛 1010
可持久化字典树,每个节点存一棵根节点到它的节点构成的字典树,利用父节点的信息来构树。查询的时候通过最近公共祖先,查询的两个点,三个点的共同信息可以得到两点路径除公共祖先外的点构成的字典树的情况,从而得出最优解。#include #include #include using namespace std;const int maxn=1e5+9,maxm=2e6;int a[max
2013-10-07 13:00:00 1433 1
原创 hdu 4348 可持久化线段树
查询历史状态,在线做的话就要用可持久化数据结构,所谓可持久化,意思就是保存所有的历史状态,但是因为每次修改只涉及到logn个节点,所以每次只新建logn个节点。其余节点及可利用历史版本的。但是这个题目如果用lazy的话,因为每次查询会下放lazy,导致必须新建节点,最后会造成mle。所以用维护两个值来实现最后的结果。#include #include #include usin
2013-10-06 17:56:19 1159
原创 poj 3182 The Grove bfs
思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点。#include #include #include using namespace std;const int maxn=5e1+9,inf=1e9;char a[maxn][maxn],now[maxn][maxn];int dist[maxn][maxn]
2013-10-05 14:24:25 849
原创 poj 3168 Barn Expansion 排序
把每个横坐标边,纵坐标边分别排序,判断是否相邻即可。#include #include #include #include using namespace std;const int maxn=25e3+9;int n;bool use[maxn];struct{ int a,b,c,d;}data[maxn];struct A{ int key,d
2013-10-04 19:25:27 1246
原创 poj 3184 dp
优化常数即可#include #include #include #include using namespace std;const int maxl=1e6+9,maxn=1e3+9;int dp[maxl],que[maxl],top,front;int n,m,l,r;bool use[maxl];struct D{ int l,r; bool
2013-10-04 16:35:24 925
原创 poj 2373 单调队列优化dp
单调队列优化dp#include #include #include #include using namespace std;const int maxl=1e6+9,maxn=1e3+9;int dp[maxl],que[maxl],top,front;int n,m,l,r;bool use[maxl];struct D{ int l,r; b
2013-10-04 16:34:28 862
原创 poj 3167 Cow Patterns kmp
两个串匹配的话意思就是每一位对应的排序序号相等。即比它大比它小的数目对应相同。那么就可以用kmp来做了,匹配的时候相等的条件改成判断两个位置的数字排序位是否相等。#include #include #include using namespace std;const int maxn=1e5+9;int a[maxn],b[maxn],cnt[maxn/4][30],next
2013-10-03 23:41:33 1020
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人