- 博客(90)
- 收藏
- 关注
原创 最大流ISAP模板
#includeusing namespace std;struct Edge{ int from,to,cap,flow;};const int maxn=650;const int INF=0x3f3f3f3f;struct ISAP{ int n,m,s,t;//结点数,边数(包括反向弧),源点编号,汇点编号 vectoredges; vector
2015-07-18 13:35:31
733
原创 最大流Dinic模板
#includeusing namespace std;const int maxn=650;const int INF=0x3f3f3f3f;struct Edge{ int from,to,cap,flow;};struct Dinic{ int n,m,s,t; vectoredges; vectorG[maxn]; bool vis[ma
2015-07-17 19:02:17
919
转载 0-1分数规划
转自:http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html【关键字】0/1分数规划、最优比率生成树、最优比率环 【背景】 根据楼教主的回忆录,他曾经在某一场比赛中秒掉了一道最优比率生成树问题,导致很多人跟风失败,最终悲剧。自己总结了一些这种问题的解法,因为水平有限,如果有
2015-07-08 19:11:44
2261
转载 POJ3349-Snowflake Snow Snowflakes
转自:優YoU http://user.qzone.qq.com/289065406/blog/1304831877大致题意:在n (n 两片雪花相等的条件:雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的) 解题思路:Hash吧!连加求余法 求key 值,链地址法解决冲突设雪花6片叶子的
2015-04-23 17:14:52
469
原创 hdu1238——Substrings——————【求多个字串的最长公共子串】
/** 解题思路:因为给的数据范围比较小,所以就是暴力思想。首先找出最短的串,然后从短到长截取子串,遍历除最短串以外的其他串,看是否含有相同的子串。*//*题目大意:给t组测试数据,每组有一个n,代表有n个字符串,求n个字符串中含有的最长公共子串,此处,逆序也算是公共子串,如abc与cba。*//*处理string的函数。1)a.substr(i,j)将a串从i位置开始截取
2015-03-05 10:12:27
599
原创 poj1394——Minimum Inversion Number——————【线段树单点更新、逆序数特性】
/** 解题思路:通过线段树求出给出的序列的逆序数,通过本题给出的序列都是连续的序列这个特殊条件,可利用递推式求出改变后的序列的逆序数,更新出最小值即可。*//** 题目大意:给整数n表示有n个数组成一个序列,从0到n-1这n个数,给出一个序列,求如果重复从首部取一个元素放到尾部能得到的序列的最小的逆序数。*//** 在一个排列中,如果一对数的前后位
2015-02-03 19:10:24
723
原创 poj3311——Hie with the Pie——————【状态压缩、TSP旅行商问题】
/** 解题思路:首先预处理出来各个点间的最小距离,然后dp求解。定义状态dp[i][j]代表当前访问过的城市用十进制表示为i,最终停留在j城市所走的最短距离。初始化dp[1][0]=0,状态值i所表示的二进制的2的零次方为1表示城市0被已经经过,状态值代表的二进制的2的m次方为1表示城市m已经经过。*/#include#include#include#includeu
2015-01-31 18:51:59
668
原创 nyoj85——炮兵阵地——————【状态压缩、动态规划】
/** 结题思路:用dp[r][i][j]表示第r行r行状态为i,r-1行状态为j时的最大可部署炮兵的个数。通过求解合法状态,缩小需要遍历的状态范围。同时求出各个合法状态的二进制中1的个数,然后特殊处理首行,然后dp求解每行每种可行状态对应的可部兵的最大个数。状态转移方程dp[r][i][j]=max(dp[r][i][j],dp[r-1][j][k]+num_1[i])。*/
2015-01-31 13:07:24
559
原创 poj1321——棋盘问题——————【状态压缩、动态规划】
/* 解题思路:首先确定各个状态值对应的二进制中有几个1。然后初始化dp[0][0]为一种解决方案,虽然不会计入最后的结果。但是却影响着下面每行的计算。只对二进制中1的个数小于等于k的状态值操作,枚举每种状态值。本行j状态值下的方案数继承上一行j状态值下的方案数,上一行中状态为j时的dp数组如果是0时,对本行的dp结果其实无影响,产生影响的是dp[i-1][j]不为0的那个。由上一行的状态
2015-01-30 16:15:07
915
原创 poj3254——Corn Fields——————【状态压缩】
/** 解题思路:首先将原图每一行当做一个二进制数,按位取反得到另一个十进制数。然后求出在所给的列的范围内的合法状态,即没有任意两个1相邻,放入数组legal中,每种合法状态对应数组的一个下标。再单独求出第一行的所有可行状态,将dp[0][i]初始化。最后求出下面的每一行的可行状态,即跟本行的上一行不冲突且在本行可行。累加结果即可求出答案。*//** 题目大意:给出M
2015-01-29 17:25:51
525
原创 hdu2126——Buy the souvenirs——————【01背包记录物品最多时种数】
/** 解题思路:多加一维表示物品个数。dp[j][k]代表背包容量为j,物品个数为k时的组合种类数目。*//* 题目大意:给你n种物品,有m块钱,然后给出n种物品的花费,问物品个数最多时的组合种数有多少。*/#include#include#includeusing namespace std;#define maxn 550int dp[max
2015-01-28 18:54:54
655
原创 hdu3466——Proud Merchants——————【01背包排序】
/** 解题思路:明显的01背包,但是这个有一个金额限制,所以不仅仅是01背包,因为转移方程应为 for(int k=0;k for(int i=V;i>=items[k].q ;i--){ dp[i]=max(dp[i],dp[i-items[k].p]+val); }要保证无后效性,需要让dp[i-items[k].p]比dp[i
2015-01-28 11:54:54
709
原创 hdu2639——Bone Collector II——————【01背包、第k优解】
/** 解题思路:由于是让求第k优解问题,所以这里不再用转移方程,而是将转移过程转化成加入该件物品形成的有序序列tmpa[]和不加入该件物品形成的有序序列tmpb[]合并的过程。引用看到的一个例子:”如果想在全校找前十名的学生,只需要将各班的前十名合并后找前十即可“。*//** 题目大意:给你t组测试数据,每组测试数据包含n,v,k。然后是两行分别代表第i件物品的价值和
2015-01-27 17:05:42
622
原创 hdu2955——Robbers——————【01背包】
/** 解题思路:这道题是01背包的变型。通常的题目是dp[i]代表背包装重量为i的物品的价值。而这个题目是将价值作为背包容量,将不被捉到的概率作为背包的值。状态转移方程为dp[j]=max(dp[j],dp[j-cost]*weight)。*/题目大意:有人想抢劫银行,给定T,代表T组测试样例,给定一个概率P即抢劫被捉概率要控制在该概率内,给一个n即有几个抢劫目标,下边n行分
2015-01-26 16:12:06
566
原创 hdu3394——Railway——————【判断桥和双连通分量】
/** 解题思路: 本题中的冲突边是指形成环的边且边数大于点数,即本环中所有的边都是冲突边。 不必需边是无向边形成的环,即所要求的桥。*/题目大意:要在景点修铁路,给定景点个数n,要修的铁路条数m。如果是不是无向边构成的环形路线,则是不必要的铁路。如果两个环有公共边,则环中
2015-01-24 16:48:50
662
原创 poj3352——Road Construction——————【加边为边-双连通图】
/** 解题思路:找到图的边-双连通分量,将分量缩成点后,求出缩点后的dfs树的各个结点的度,求出叶子结点(度为1)个数,根据定理计算需要加的最少边即可。*/题目大意: 某度假公司要在可互相到达的各景点(连通图)的一些路上做些装饰,正在装饰的道路暂时不可以通行,现需要架设临时通道,使各个景点仍可相互到达,问最少需要架多少条通道。/*
2015-01-23 15:33:23
714
原创 uva11419——SAM I AM——————【最小覆盖数、打印最小覆盖】
/** 解题思路:将每一行看作一个X结点,每一列看作一个Y结点,每个目标对应一条边,这样,子弹打掉所有目标意味着每条边至少有一个结点被选中。构造解:借助于匈牙利树,从X中的所有未盖点出发扩展匈牙利树,标记树中的所有点,则X中的未标记点喝Y中的已标记点组成所求的最小覆盖。*/题目大意:在R*C的网格中放目标,子弹水平或垂直飞行,会打掉飞行路线上所有目标,问打掉所有目标,至少需要多
2015-01-20 17:39:23
658
原创 poj2771——Guardian of Decency——————【最大独立集、最大匹配扩展】
/** 解题思路:将每个学生当做一个结点,如果两个人4个条件都不满足,就意味着他们不能同时被选择,连一条无向边。问题就转化为求这个图的最大独立集。可以分男女入图,也可以不分男女。下面给出两种方法。*/题目大意: 有个思想保守的老师的老师,组织外出,但又怕同学在旅途中产生爱意,于是要求满足带出去的任意两个同学至少满足下面4条中的一条。(1)身高差大
2015-01-19 17:18:25
552
原创 hdu1350——Taxi Cab Scheme——————【最小路径覆盖、最大匹配转化】
/* 解题思路: 本题目模型是DAG的最小路径覆盖。最小路径覆盖可以转化成最大匹配求解。 解法:将所有节点i拆为点Xi和点Yi,如果图中存在有向边i——>j,则在二分图中引入Xi——>Yj。图建好后就可以增广求最大匹配,进而求最小路径覆盖。*/题目大意: 你需要安
2015-01-19 10:20:52
886
原创 hdu1507——Uncle Tom's Inherited Land*————————【二分图最大匹配、奇偶分离】
/* 二分图最大匹配,同时加上奇偶分离。用匈牙利算法增广找最大匹配及相互匹配的点对*/题目大意:有n*m的一块儿土地遗产,现在想要卖掉,已知黑格子是池塘不能卖,白格子需要两块儿连一起才能卖,问最多能卖多少个这样的可卖土地。/** 划分奇偶 二分匹配 增广至最大匹配*/#include#include#include#includeusi
2015-01-18 11:46:40
600
原创 HDU2063——过山车——————【二分图最大匹配模板】
/** 未盖点:不与任何匹配边邻接的点 匹配点:匹配边相连的顶点 匹配:两两没有公共点的边集 交替路:从未盖点出发,依次经过非匹配边,匹配边,非匹配边....所得到的路径 增广路:交替路的终点是一个未盖点。 增广路的长度为奇数,因为非匹配边比匹配边多一条。 一个匹配是最大匹配的充要条件是不存在增广路。 匈牙利算法,即不断增广,直到
2015-01-17 20:55:13
604
原创 hdu1269——迷宫城堡——————【kosaraju模板】
这个算法可以解决判断和打印各个强连通分量的问题。对于本题,只要判断就行。#include#include#include#include#includeusing namespace std;const int MAXV=11000;vectorG[MAXV],T_G[MAXV]; //原图和转置图vectorS; //用来存放dfs后的
2015-01-17 10:58:08
540
原创 hdu1269——迷宫城堡——————【双向并查集判断】
解题思想:通过利用设定1为根节点,然后建立以1为根的树,查找时,如果所有节点都是以1为根,则说明单向互通;然后再逆序采用相同的操作,如果逆序得到的所有节点也是以1为根,则说明逆向互通,此时说明图为强连通图。这里用两个父亲数组来完成正向和逆向操作。#include#include#include#includeusing namespace std;const int MAXV=110
2015-01-17 08:41:30
941
原创 hdu1269——迷宫城堡——————【kosaraju】
概念解释 [强连通]——有向图G中,任意点对能相互到达,即存在路径,则称为强连通。 [连通分量]——指的是无向图中的极大连通子图。一个连通图的生成树是一个极小连通子图。 //只是判断是否强连通#include#include#include#include#includeusing namespace st
2015-01-16 18:47:33
702
原创 hdu1879——继续畅通工程——————【kruskal模板】
以前写过这道题不止一遍,但是再碰到这个题目的时候还是迷茫,长时间不练习这方面的题目就不会了,看来真的需要坚持码代码,不写会生疏的!#include#include#include#includeusing namespace std;//最小生成树,拓扑排序,最短路径,二分图,网络流。const int N=110;int father[N*N];struct node {
2015-01-15 20:40:19
682
原创 hdu1728——逃离迷宫——————【BFS】
解题思路:通过曾经一个计数数组,将所有可到达该点位置的转弯次数更新为最小值,最后通过比较目的位置的转弯次数来判断是否能够到达。#include#include#include#include#includeusing namespace std;int f[4][2] = {{ -1, 0}, {1, 0}, {0, 1}, {0, -1}};char Map[110][110]
2015-01-12 10:20:18
495
原创 hdu1253——胜利大逃亡——————【BFS】
简单三维地图,直接广搜就行了。#include#include#include#includeusing namespace std;int Map[55][55][55];bool vis[55][55][55];int f[6][3] = {{ -1, 0, 0}, {0, 1, 0}, {1, 0, 0}, {0, -1, 0}, {0, 0, -1}, {0, 0, 1}
2015-01-09 21:00:50
547
原创 大数阶乘——————数组模拟
突然发现大数阶乘还能用这么简单的数组模拟,但是感觉复杂度好像有点高,一次运算是n*MAXN的复杂度,虽然空间复杂度比较低。#include#includeconst int MAXN = 50000;int main() { int n; scanf ( "%d", &n ); int f[MAXN]; memset ( f, 0, sizeof ( f
2015-01-05 10:03:06
642
原创 hdu2102——A计划——————【BFS】
题目比较简单,只是一个简单搜索,只是添加了一点条件。传输机实现上下层转移,仅仅这个条件。#include#include#include#includeusing namespace std;int f[4][2] = { { -1, 0}, {0, 1}, {1, 0}, {0, -1}};char Map[15][15][2];bool vis[15][15][2];str
2015-01-02 16:45:04
551
原创 uva133--The Dole Queue
看到这个题,跟约瑟夫环感觉差不多,但是这个数据范围比较小,可以模拟实现,我用的是循环链表实现的过程。中间用到了标记,因为对于样例10 4 3来说,就会到后边只剩下7 10这两个节点形成的环,但是now_n这时候指向已删除的2节点,now_f指向已删除的6节点,然而,这就需要让now_n继续向后指,也指向6节点,这样就需要标记是否还在环内。#include#includeusing name
2014-12-31 09:17:44
505
转载 约瑟夫环问题
为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是(m-1) mod n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始):k k+1 k+2 ... n-2,n-1,0,1,2,... k
2014-11-12 20:45:05
467
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人