自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(193)
  • 资源 (1)
  • 收藏
  • 关注

转载 图论500题

1 =============================以下是最小生成树+并查集====================================== 2 【HDU】 3 1213 How Many Tables 基础并查集★ 4 1272 小希的迷宫 基础并查集★ 5 1325&&po

2013-08-06 17:35:03 1419

转载 测试数据

1、USACO2006年November题目和测试数据的网址http://ace.delos.com/NOV062007年open赛题目和测试数据的网址http://ace.delos.com/OPEN07以此类推2、日本ACM比赛http://www.acm-japan.org/http://icpc2010.honiden.nii

2012-11-22 19:41:48 1283

转载 一篇关于A*的文章相当好

http://theory.stanford.edu/~amitp/GameProgramming/

2013-10-27 21:53:17 661

转载 后缀数组模板

/* suffix array 倍增算法 O(n*lgn) build_sa( ,n+1, ) 注意n+1 getHeight( , n) n = 8 ; num[] = { 1, 1, 2, 1, 1, 1, 1, 2, $ }. 注意num数组最后一位值为0,其它位须大于0! rank[] = { 4, 6, 8, 1,

2013-10-11 15:10:44 642

原创 poj 2392

对于m的容量的背包,对于n个物品所能得到的最大值,最优解中a值最大的物品,放到背包的他所能放置的最上方,并且有多少放多少到最上面(最优解中a值小于他的还是可以放),可知这样做不会丢失最优解。所以对于前n个物品,先决策a值最大的物品放多少个,并且放置在他所能放置的最上方,再决策于剩下的容量和剩下的物品的最优解。所以先对物品按a值排序,即f[i[j]=max(f[i-1][j-k*h[i]]+h[i]

2013-09-17 23:54:42 899

原创 poj 3225

这道题目纠结死了,想了各种实现终于A了。还有没看清题意,空集的时候没输出“empty set”,wa到吐。线段树成段更新。U:把区间[l,r]覆盖成1 I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0 C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换开闭区间的问题可以把(i,i+1)抽象为一个点,最后得到2*65535+1个点,

2013-09-17 18:34:52 810

原创 hdu 4734

简单数位DP,f[i][j]表示i位的数字有多少个数权值小于j,i位的数是实际意义的i位数,就是是以1--9开头,不包括0、#include #include #include #include #include #include #include #include #include #include #define eps 1e-8#define LL long l

2013-09-17 15:02:02 1311

原创 hdu 4406

最大费用流,就是流量不固定的最大费用流。不一定是最大流。就是经典的费用与流量平方成正比的最小流(白书上有)模型的应用。一个流,代表一个分配。如果所有科目都及格的话,直接拆边就可以了。这里要考虑的就是如果科目不及格的情况。考虑如何加边能够使最大费用流是保证所有的不及格的科目都及格这一条件下的最大费用流,向s和表示各个不及格科目的节点之间连一条费用足够大(这个”大“大于所有科目(不及格的定

2013-09-11 20:38:55 1415

原创 HDU 3535

定义f[i][j][k]为对于前i个组,前j个物品,容量为k,所有的选择都满足相应组的要求的最大值。混合了三种情况。求解每个状态时,根据相应组的要求,分别进行不同的转移。状态转移方程,三种情况分别讨论,比较好想,具体代码。可以滚动数组优化,不想优化了。今晚不想刷题T_T#include #include #include #include #include #include

2013-08-28 00:39:58 708

原创 BNU 16225

#include #include #include #include #include #include #include #include #define LL long long#define myabs(x) ((x)>0?(x):(-(x)))using namespace std;const int inf=0x3f3f3f3f;int main(){ LL

2013-08-27 01:02:32 657

原创 HDU 3033

如果枚举每组中选出的情况,情况太多,不行。后来又想对、先01背包求出每个组中每个容量至少选一个的最大值,再对整体进行01背包。容量太大,会超时。后来想,直接对整体进行01背包就可以了,就和多重背包的01背包解法类似。但是为了保证最后的结果是没个组的至少选一个,所以状态f[]i[j]k][定义对于前i组,前j个物品,容量为k的每组至少选一个的最大值。可知f[i][j][k]=max(f[i-1]

2013-08-26 20:42:47 599

原创 poj 2923

思路看了http://blog.csdn.net/woshi250hua/article/details/7636061不过是用记忆化搜索写的#include #include #include #include #include #include #include #include #define LL long long#define myabs(x) ((x)>0?

2013-08-25 16:14:42 757

原创 POJ 3686

尝试着用二分图最大完美匹配来求解此题。把每个商品店j拆成n个点,分别代表倒数第p次在商品店加工,把每个order向每个点连线,权值为p*zij。然后用km求解。#include #include #include #include #include #include #include #include #define LL long long#define myabs(x

2013-08-23 16:27:25 747

原创 POJ 2516

还是不会建模。。。每个商定所需的物品可能来自不同的仓库,细化就是每一类物品可能来自不同的仓库,再细化就是每一个物品在最后的结果中都有一个在某个仓库中的物品与其匹配。所以对于每一个物品建点,商店的为x集合,仓库的为y集合。在相同的物品见连线,最后用KM求解。其实题目已经给出了提示,k很小0~3,直接对每个物品建图即可。

2013-08-22 21:34:44 782

原创 poj 2226

板子可以横着或竖着放。最后就是求用最少的横着放的或竖着放的板子覆盖所有的‘*’。可知,如果要放一个板子,因为板子可以重叠,所以要放就要把连续的一整块都覆盖。一个‘*’可以被其所在的横着的板子和竖着的板子所覆盖。找出所有可供选择的横着放和竖着放的板子,问题就转化为了从中选取一些板子能覆盖所有的‘*’,二分图最小覆盖解决,横着的板子为点集x,竖着的板子为点集y。#include #include

2013-08-21 21:39:58 719

原创 POJ 2594

还是DAG上的最少路径覆盖,此题说有的点可以重复走,最后的选择结果,一个点所在路径的下一个点不管是怎么到达的,只要可达就可以。用二分匹配求最少路径覆盖,二分图中边的含义就是i下一个点可走j,所以建二分图时,只要两点可达就连边。floyd求是否可达。#include #include #include #include #include #include #include #inc

2013-08-21 10:20:27 776

原创 POJ 2060

DAG最少路径覆盖、忽略了从一个点到另一个点也要算时间,检查了一晚上,~~~~~#include #include #include #include #include #include #include #include #define LL long long#define myabs(x) ((x)>0?(x):(-(x)))using namespace std

2013-08-21 00:58:33 723

原创 2-SAT模板

int dfs(int u) { if(mark[u]) return 1; if(mark[u^1]) return 0; mark[u]=1; S[top++]=u; int i,v; for(i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(!dfs(v)) return 0; } return 1;

2013-08-20 21:51:43 781

原创 强连通分量模板

#include #include #include #include #include #include

2013-08-20 21:48:12 712

原创 边双联通及其缩点

#include #include #include #include #include #include #define LL long long using namespace std; const int maxm=1000*2+10; const int maxn=1000+10; struct n

2013-08-20 21:41:44 706

原创 点双联通和二分图着色(二分图判定)模板

void dfs(int u,int fa) { pre[u]=low[u]=++dfs_clock;//不想改了,ow不用定义成数组,直接定义一个变量 lowu就行了 int i,j; node tem; for(i=1;i<=n;i++) // {

2013-08-20 21:12:55 835

原创 hdu 1059

多重背包二进制拆分思想#include #include #include #include #include #include #include #include #define LL long long#define myabs(x) ((x)>0?(x):(-(x)))using namespace std;const int inf=0x3f3f3f3f;int

2013-08-20 19:43:08 783

原创 poj 2184

最后的结果s无非属于0~100000,枚举每个s相对应的f的最大值f,比较s+f得到最终的最大值。求每个s相对应的f的最大值f用dp来求解,定义ans[]i[j]表示对于前i组数s的和为j的最大的f值,和01背包类似。ans[i][j]=max(ans[i-1][j],ans[i-1][j-s[i]]+f[i]),状态j原本范围为-100000~100000,所以统一加100000,和0~20

2013-08-20 14:36:39 723

原创 KM算法模板

int S[maxn],T[maxn];int g[maxn][maxn];int lv[maxn],rv[maxn],leftp[maxn];int slack;int n,m;int match(int u){ S[u]=1; int i; for(i=1;i<=n;i++) { if(lv[u]+rv[i]==g[u][i])

2013-08-19 08:51:13 800

原创 hdu 3488

和最少路径的覆盖差不多,先把每个点拆为两个点,分别放在x集合和y集合中,若i->j,那在图中加边xi->yj每种方案和一个完美匹配是对应的。在完美匹配中每个点在x,y集合中的点都有相匹配的点,也就是每个点入度出度都为1.二分图最佳完美匹配模板题,只不过求最小,把边的权值改为负数,求最大即可。#include #include #include #include #inclu

2013-08-19 00:01:11 769

原创 poj 1486

可以直接模拟这个过程,可知如果当前有点仅属于某个幻灯片,那么便可确定此点和此幻灯片的匹配关系,反之如果有幻灯片只包括某个点,也可确定此幻灯片和此点的匹配关系,如果没有这两种情况的话,剩下的就不能确定了。#include #include #include #include #include #include #include #include #define LL long l

2013-08-18 14:46:36 894

原创 hdu 2819

首先如果存在解的话,只换行或换列,就可以得到解。只换行的话,每个列上主对角线上的1肯定是初始状态(没有进行任何交换)中在此列为1的行得来的,构造二分图,x代表行,y代表列, 在g[x][y]=1(也即y列上的1可有第x行得到)的两点连上一条边,进行匹配,得到每一列的1相匹配的行号(初始状态),然后构造一系列交换。#include #include #include #include #

2013-08-18 12:05:11 910

原创 hdu 4568

最短路 + DP把边界看成一个点和其他treasure点构成了k+1个点,然后求出这k+!个点,任意两点之间的最短路径(因为任何一个最优方案中的边肯定是最短路径),一个图就确定了(可能两个点之间就不可到达,也不需要管,因为他们的最短路为正无穷大),我用的SPFA,用Djikstra写了超时吗,可能是哪没写好。然后可知题目让求的就是从边界这个点访问最多的点并且返回所用的最短路径。也就是经典的TS

2013-08-12 00:49:00 912

原创 ZOJ 3537

这道题,就是先判断是不是凸多边形。先求出凸包,如果所有点都在凸包上,那这些点就围成了凸多边形,反之则不是。然后就是分割凸多边形了,刚开始也想到了先确定一条边所在的三角形,从而确定分割的边。但边没选好,导致后续的状态很凌乱。后来看了相关的资料。先按一个顺序将多边形的n个点编号1--n。求f[1][n]先以边n--1为基准,确定其所在三角形,然后就得到了两个多边形。得到状态转移方程,f[1][n]=m

2013-08-10 00:51:33 793

原创 poj 2296

第一道2-SAT,做的挺纠结的主要是添加边的时候不细心,导致各种错误,检查了n遍终于A了。2-SAT问题就是一组布尔变量x,分别代表两种对立的选择。还有一组变量之间的或关系的约束条件。看能否给这些变量赋值,使最后赋值的结果能够满足约束条件。用2-SAT解决关键问题,就是确定变量及其取值所代表的的含义,还有约束条件或关系的确立。我总结了一种方法来确定或关系,就是先写出不满足题目约束条件的与关

2013-08-10 00:29:44 823

原创 poj 2828

线段树点更新。最直观的想法就是用链表模拟,发现数据量太大,不可能。然后看能否直接推出每个人在最终序列的位置。很显然,最后一个插入的人插入的位置就是他在最终序列中的位置,先确定了最后一个人的位置。然后看倒数第二个,先不考虑最后一个人的插入,在他前面所排的人的个数有且仅为他插入的位置,那在最终的序列中不包括最后一个人,他前面的人数肯定有且仅为 pos[i]。也就是在长度为n的序列中,不包括最后一个

2013-08-07 01:01:33 665

原创 hdu 4512

LICS的应用。还是从最后的结果考虑,肯定是在某个位置的i左边(包括i)递增的序列,右边(包括i)相应的对称的递减的序列,这个序列肯定是,1--i和i--n的逆序的公共递增序列,而1--i和i--n的逆序的公共递增序列肯定是一个符合题意的选择,那么以i为分界点的最优解肯定就是1--i和i--n的逆序的最长公递增序列。然后枚举位置i取以i为分界点的最优解的最大解就可以了。先按这个思路A了,有很多无用

2013-08-06 17:35:08 747

原创 hdu 1423 LICS

看了http://wenku.baidu.com/view/3e78f223aaea998fcc220ea0.html 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define LL long long

2013-08-06 17:35:05 717

原创 poj 1135

Dijkstra最短路模拟每个key的坠落时间,发现就是Dijkstra。求出每个key的时间求其最大值,再求每条边整个坠落的时间,求其最大值,得二者最大值即结果。其中每条边的坠落事件为tv+(cost-(tv-tu))/2,其中u,v为边的两个key节点,tv>tu,cost为边的权值 1 #include 2 #include 3 #include 4 #

2013-08-06 17:35:01 752

原创 poj 1112

二着色+DP在不是互相认识的节点之间连一条边,最后得到由多个连通分量构成的图。把图中节点分为两组,保证图中每条边的两个顶点不能再同一组。对每个连通分量进行二着色,每个连通分量的点就分为了a,b两组。假定最后整个图分为1,2两组。每个连通分量的a,b两组,无非一个在1组一个在2组,通过DP,确定每个连通分量中a,b哪个在1组,哪个在2组时最有。然后就是DP的过程,没想出来,看了其他人的结题报告。

2013-08-06 17:34:58 739

原创 poj 1087

二分图匹配+floyd求图中节点是否可达。模型很容易想到。此题我认为用网络流最好解释,如果有device有重复的话。二分图建模比较麻烦。一开始没想到这点,用二分图做的,但是AC了,数据应该没有device重复的情况。然后就是判断一个插头通过适配器能转化成什么其他的插头,刚开始用矩阵乘法来判断这个关系,数据一开到500运行时就运行错误(感觉也不是很大啊,至今还不知道原因),后来在网上发现有用floy

2013-08-06 17:34:56 598

原创 poj 1094

拓扑排序,做的时候wa了n次,后来找来数据,又想了想,发现了自己的错误,就是当拓扑排序的时候出现了不确定的情况,还要在拓扑下去,因为可能还会有矛盾的情况出现,保证没矛盾的情况下才可以说是不确定的情况 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int max

2013-08-06 17:34:54 711

原创 poj 3612

DP+简单优化,状态转移方程容易看出,优化看了http://hi.baidu.com/forverlin1204/blog/item/df9c62dc0fb16bd38d1029d8.html。哎,太粗心了,初始化时忘了得平方,看了1个多小时才发现 1 #include 2 #include 3 #include 4 using namespace std; 5 co

2013-08-06 17:34:51 1029

原创 poj 1322

状态转移方程还是很容易想出的,但是n的限值1000不知道为什么 1 #include 2 #include 3 #include 4 using namespace std; 5 const int maxn=100+10; 6 double f[2][maxn]; 7 int c; 8 int n,m; 9 int main()10 {11

2013-08-06 17:34:49 836

原创 poj 3254

状态压缩DP基础题 1 #include 2 #include 3 #include 4 using namespace std; 5 const int maxn=15; 6 const int mod=100000000; 7 int num[maxn],s[200]; 8 int f[maxn][200],amoun[113]; 9 int ma

2013-08-06 17:34:47 676

算法设计与分析

很好很不错,讲解了算法,阅读之后应该会有帮助

2012-08-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除