
ACM
文章平均质量分 73
wwwiskey
学生
展开
-
二分图匹配
二分图:设G=(V,{R})是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。最大匹配:匹配中边数最多的匹配。完全匹配(完备匹配):如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,原创 2012-08-16 11:26:37 · 1473 阅读 · 0 评论 -
状态压缩递推(States Compressing Recursion,SCR)
我们暂时避开状态压缩的定义,先来看一个小小的例题。【引例】 在 n*n(n≤20)的方格棋盘上放置n 个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。 【分析】 这个题目之所以是作为引例而不是例题,是因为它实在是个非常简单的组合学问题:我们一行一行放置,则第一行有n 种选择,第二行n-1,……,最后一行只有 1 种选择,根据乘法原理,答案就是转载 2012-07-27 18:53:09 · 4656 阅读 · 7 评论 -
ACM模板列表
1:数学1.1:数论1.1.1:中国剩余定理1.1.2:欧拉函数1.1.3:欧几里得定理1.1.3.1:欧几里得定理1.1.3.2:扩展欧几里得1.1.4:大数分解与素数判定1.1.5:佩尔方程1.2:组合数学1.2.1:排列组合1.2.2:容斥原理1.2.3:递推关系和生成函数1.2.4:Polya计数法1.2.4.1:Polya计数公式原创 2012-08-23 08:31:59 · 2135 阅读 · 2 评论 -
图的存储(链式前向星)
/*所谓的这种存储边的方法,就是邻接链表在的静态实现(人称:池子法) *就是比较省时间开销 */#include #include #define MAXM 1000005#define MAXN 10005struct node { int v, w, pre;}edge[MAXM<<1];int p[MAXN], nEdge; //p每个点相关边的起始位置,nEdg原创 2012-08-18 16:07:08 · 4956 阅读 · 0 评论 -
强连通分量算法Kosaraju 和 Tarjan
Kosaraju算法对每个不在树中的点开始DFS一次,并记录离开各点的时间,这里是离开的时间,而不是到达时的,比如有图1->2 2->3 则1,2,3分别对应的时间是3 2 1,因为3没有出边,所以最先离开,其次是2,最后是1,DFS后,在同一棵树中的点,如果dfn[v]>dfn[u]则说明点从v有可能到达u,而这棵树中的dfn[]最大的点,肯定可以到达每个点,从而在原转载 2012-08-17 11:32:26 · 1693 阅读 · 0 评论 -
AVL树 模板
#include #include #include #include #include #include #define oo 0x7FFFFFFFusing namespace std;template class AVL {private: class node { public: node *l,*r; int h,s原创 2012-08-03 15:46:22 · 2010 阅读 · 0 评论 -
素数性测试(Robin-Miller算法)
算法分类:随机算法算法原理:输入:一个大于3的奇整数n和一个大于等于1的安全参数t(用于确定测试轮数)。输出:返回n是否是素数(概率意义上的,一般误判概率小于((1/2))80)即可)。将n-1表示成2sr对i从1到t做循环做以下操作:选择一个随机整数a(2 ≤ a ≤ n−2)计算y ←转载 2012-08-16 13:27:02 · 1888 阅读 · 0 评论 -
KMP算法
#include #include const int LEN = 1000;void prefix(char* mode, int* next) { int j = -1, m = strlen(mode); next[0] = -1; for (int i=1; i<m; i++) { while (j!=-1 && mode[j+1]!=mode[i]) j = next[原创 2012-07-31 11:07:09 · 669 阅读 · 0 评论 -
树状数组
//树状数组的模板const int LEN = 1000;int c[LEN];int n; //数组的长度 int lowbit(int x) { return x & (-x);}void add(int index, int num) { while (index <= n) { c[index] += num; index +=原创 2012-08-01 10:49:45 · 514 阅读 · 0 评论 -
ACM中一类基于Markov链模型的期望问题(概率DP)
Abstract本文要讨论的是一类期望问题的解,基于以下限制:1.状态空间为一有限集合S。2.转移F:S->S是从S到S的一个映射,且该映射存在环。或者说将S画做一张图,任一状态s∈S对应图中一个点,则F为图的一个有向边集,且该图存在环。3.转移的代价C(F)为一个常量c(通常c=1)。或者说对于上面的图,任一条边的权为c。4.求从某一状态ss至另一状态st的代价期望。转载 2012-08-07 09:07:33 · 3286 阅读 · 0 评论 -
HIT Training Camp IV 题解
难度分析:本次题目难度呈中间低,两头高的趋势(恶搞一下,无视之吧)没有数据结构题目,图论题目有两道,一个是网络流,一个算是补充大家图论盲点的题目吧(弦图的判定问题)1. zoj1015 Fishing Net题解见: http://blog.youkuaiyun.com/yang_7_46/article/details/81813022. zoj 1008 Gnome Tet原创 2012-11-30 07:57:52 · 1116 阅读 · 0 评论 -
POJ 1769 Minimizing maximizer
DP+线段树。(这道题目整的挺纠结,有待琢磨……)题解(转载的):题意分析: 如果我们考虑将数组看成一条[1, n]的线段, 而每项操作也看成是从[ i[k], j[k] ]的线段, 那么题意就是按照线段的输入顺序, 将线段[1, n]从左到右依次覆盖, 问题变成求最小的覆盖线段总数.算法思想: 考虑最基本的规划方法, 用Opt[原创 2013-01-26 23:16:44 · 3134 阅读 · 0 评论 -
POJ 1470 Closest Common Ancestors
最近公共祖先:在线算法和离线算法。离线算法(Tarjan):伪代码如下:注意: 存储树的时候存储的是单向边,所以checked[u] = true 写在中间不会出现死循环, 这样可以避免重复计算公共祖先。如果存储的树是双向边的话,就必须写在前面,这样子可以避免死循环,双向边的情况如下但是这道问题确实统计公共祖先的次数的,因此如原创 2013-01-25 19:20:03 · 1294 阅读 · 0 评论 -
LCA && RMQ
讲解详见:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor题目……原创 2013-01-26 23:45:15 · 758 阅读 · 0 评论 -
POJ 1986 Distance Queries
题意:给一棵树的信息。给q个询问:farm A和farm B,输出A和B的距离。最近公共祖先,但是要记录距离的信息。#include #include #include #include #include using namespace std;const int MAXN = 40004;typedef pair PAIR;vector edge[MAXN], que原创 2013-01-27 20:46:13 · 1512 阅读 · 0 评论 -
POJ 1182 食物链
并查集的应用。题意略。题解:用数组a来表示x节点与父节点的关系,Union操作和Find操作看代码。 a[x] = 0 父子同类 a[x] = 1 子吃父 a[x] = 2 父吃子#include #include using namespace std;const int MAXN = 50005;int set[MAXN], a[M原创 2013-01-29 17:45:44 · 863 阅读 · 0 评论 -
POJ 1703 Find them, Catch them
并查集应用。这个题目和【食物链】类似。 a[x] = 0 表示x与父节点同gang a[x] = 1 表示与父节点不同gang#include #include using namespace std;const int MAXN = 100005;int set[MAXN], a[MAXN];int Find_set(int x) {原创 2013-01-29 21:02:24 · 2552 阅读 · 7 评论 -
POJ 1988 Cube Stacking
并查集应用。题意:初始有N个stack,编号为1-N,给两个操作M x y :将x所在stack的所有cube移到y所在stack的上面C x :统计在x下面的cube的个数题解:fa[x]表示x的父节点,num[x]表示以x为根的并查集中节点的总数,rank[x]表示x在当前stack(并查集)中的排名那么,在x下面的cube个数为: num[father(原创 2013-01-28 16:35:41 · 750 阅读 · 0 评论 -
ZOJ 狗狗40题
把这个拷贝过来,自己留着刷。。。。哈哈IDZOJ IDTitleRatio (AC/All)10011021The Willy Memorial Program23.69% (82/346)10021030Farmland50.33% (151/300)100转载 2013-01-31 17:46:07 · 2390 阅读 · 0 评论 -
POJ 2912 Rochambeau
并查集应用。这道题目和 POJ 1182 食物链 非常类似。枚举所有judge,不处理出现当前judge的round,然后利用食物链的解法判断冲突。就可以找出来最终的judge。还有一步就是找到judge之后,要得到确定此judge的round数:这个round数就是在枚举的时候,其他人出错的round数的最大值——因为,到这个最大round数时,其他人都被排除,剩下的就是真正的jud原创 2013-02-01 18:04:07 · 985 阅读 · 0 评论 -
Simplified GSM Network
题目链接地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1271很少发题解,但是这是自己切掉的第一个final题目,小小成就感。题目解法很多,经典的Voronoi图,但是比较麻烦。抽象后即为求两点之间的最短路,用fl原创 2013-01-21 17:19:48 · 1001 阅读 · 0 评论 -
HDU 最短路
★ 1548 A strange lift ★ 2544 最短路 ★ 3790 最短路径问题 ★ 2066 一个人的旅行 ★ 2112 HDU Today★ 1874 畅通工程续★ 1217 Arbitrage (a->b的汇率知道,b->a的汇率应该看作是未知的,即,b->a不能直接交换。自己想当然了,给跪了,略坑啊)★ 1转载 2013-02-01 14:44:26 · 659 阅读 · 0 评论 -
划分树
划分树详解,参见论文 《划分树算法总结》论文里面有些代码不是很完美,所以建议参照我的代码,不过里面讲的还是蛮清楚的。里面的三道题目这里面只给出两道题目的代码(论文题目的题号有误,注意)。POJ 2104 k-th number裸的划分树,求区间第k大数#include #include #include using namespace std;co原创 2013-02-26 14:03:59 · 1757 阅读 · 0 评论 -
SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1101 Domino 欧拉路102 Coprime 枚举/数学方法103 Traffic Lights 最短路104 Little Shop of Flowers 动态规划105 Div 3 找规律106 The Equation 扩展欧几里德107 987转载 2013-03-04 19:02:04 · 2041 阅读 · 0 评论 -
凸包相关算法汇总
求凸包的Graham算法:先极角排序,然后O(n)复杂度解决,具体做法见代码。POJ:1113 Wall题解:求凸包,且要求城墙也城堡之间有L的距离,只需要加上L为直径的圆周长即可。#include #include #include #include #include using namespace std;const int MAXN = 1003;con原创 2012-08-13 11:13:31 · 906 阅读 · 0 评论 -
三维凸包模板
POJ 3528三维凸包模板哈。。。。#include #include #include #include using namespace std;#define inf 0x7fffffff#define max(a,b) (a>b?a:b)#define min(a,b) (a<b?a:b)#define eps 1e-7#define MAXV 505//原创 2013-03-06 10:07:53 · 2299 阅读 · 0 评论 -
ACM计算几何题目推荐
把下面的东东都看看,题目刷刷应该就差不多了吧哈。。哈哈。。其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中。之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专业,GIS)。以后若有机会,我会补充、完善这个列表。计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路原创 2013-01-21 17:10:58 · 5795 阅读 · 2 评论 -
POJ 2254 Globetrotter
求球面上两个点的距离(弧长)Lab = R * arccos(cos(wa)*cos(wb)*cos(ja-jb) + sin(wa)*sin(wb))a的经纬度:ja,wab的经纬度:jb,wb关于求解公式的证明:http://blog.youkuaiyun.com/liminlu0314/article/details/8553926最初我直接建直角坐标系求原创 2013-03-01 20:20:33 · 1430 阅读 · 1 评论 -
模拟退火算法
模拟退火算法的理论讲解:《模拟退火与遗传算法》《模拟退火算法》POJ: 2069 Super star求一个半径最小的球体,包含所有的点。模拟退火,不断缩小半径,搜索……#include #include #include #include #include using namespace std;#define N 33#define e原创 2013-03-01 02:59:46 · 2716 阅读 · 0 评论 -
ZOJ 3691 Flower
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4974题意:给出空间中的一些点,在这些位置上各有 F[i] 朵花,最多可以从这个位置移出 L[i] 朵花(包括从其他地方移过来的),问最小移动半径 R 是多少时,能够把所有位置上的花移动到位置 1二分半径(二分距离的平方,避免精度损失。结果一定是某两点之间的距原创 2013-04-11 20:49:12 · 1373 阅读 · 0 评论 -
ZOJ 1450 Minimal Circle 最小圆覆盖
经典的计算几何题目,最小圆覆盖。最小的圆肯定落在三个点上,因此暴力枚举圆上的三个点即可。点增量算法,复杂度O(n^3)加入随机化,平均复杂度可以降到O(n^2)三点的外接圆圆心的函数:POINT circumcenter(POINT &a, POINT &b, POINT &c) { POINT ret; double a1=b.x-原创 2013-03-03 17:08:33 · 2098 阅读 · 1 评论 -
ZOJ 1524 Supermarket
动态规划F[i][j]:列表上第i个物品和supermarket里面第j个商品。此时可以花的最小费用。a[i] == b[j] F[i][j] = min(F[i][j-1], F[i-1][j-1] + p[j])a[i] != b[j] F[i][j] = F[i][j-1]初始化为最大值inf#include #include #in原创 2013-04-24 16:45:44 · 1201 阅读 · 0 评论 -
ZOJ 1475 Ranklist
组合数学,递推很多组合数的求解都是递推方法解的,多做些题目,涨涨姿势……:i个人,排j个rank的组合数,则:i-1个人把j个rank占满了,第i个人有j种rank,所以乘以j:i-1个人把j-1个rank占满了,第i个人随便插入j-1个rank中的方案有j种则,n个人的总方案数为:组合数很大,用java大数给过的……import java.util原创 2013-04-25 16:52:42 · 1261 阅读 · 0 评论 -
ZOJ 2901 MV Maker
类似floyd的动态规划 + 二分求幂裸DP的复杂度太高,写法如下:F(l, i) = max( f(l-1, j) +v[j][i] )时间复杂度为:O(n^2*L),L太大,无法接受先预处理2^p + 1长度的值,利用了二进制的思想,然后用上面DP的思想拼接。f[p][a][b] = 长度为2^p + 1, 第一个是a, 最后一个是b的最大value.原创 2013-04-18 17:39:15 · 908 阅读 · 0 评论 -
数论合集
注:本文关于素数部分属于转载,剩余部分根据网上资料总结。快速幂 a^b % klong long PowerMod(long long a, long long b, long long k) { long long tmp = a, ret = 1; while (b) { if (b & 1) ret = ret * tmp % k;原创 2012-08-22 09:38:10 · 2056 阅读 · 0 评论 -
[HNOI2008] 玩具装箱toy
斜率优化DP。参考资料:2004周源《浅谈数形结合思想在信息学竞赛中的应用》。斜率优化部分的证明,构造下凸曲线。本题题解:C[i] 表示前 i 个玩具的长度F[i] 表示前 i 个玩具装完之后的最小费用状态转移方程: F[i] = min { F[j] + (C[i] - C[j] + i - j - 1 - L)^2 }令 S[i] = C[i] + i 则原创 2013-04-21 17:27:36 · 2303 阅读 · 1 评论 -
ZOJ 1563 Pearls
题意:表示看了很久没有看明白……有不同质量(quality)的珍珠,且质量高的珍珠价钱比质量低的珍珠价钱高。给每种质量珍珠的购买数量a,以及这种质量珍珠的单价。价钱计算方式:(购买数量+10)×单价质量低的珍珠可以用质量高的珍珠替代。枚举j,从j到i的这些质量的珍珠都用第i种珍珠替代。状态转移方程: F(i) = min( F(i), F(j-1)原创 2013-05-05 13:25:58 · 1268 阅读 · 0 评论 -
ZOJ 1602 Multiplication Puzzle
区间dpF(i, j) = min(F(i, k) + a[i]*a[k]*a[j] + F(k, j))#include #include using namespace std;#define N 103typedef long long LL;const long long inf = 1<<29;LL f[N][N], a[N];int n;LL dp(in原创 2013-05-05 14:11:13 · 1099 阅读 · 0 评论 -
ZOJ 1636 Evaluate Matrix Sum
大水题。。。#include #include using namespace std;#define N 505int s[N][N], n, m, l[N];int main() { int T; scanf("%d", &T); for (int cas=1; cas<=T; cas++) { printf("Case %d:\n"原创 2013-05-05 17:50:36 · 1297 阅读 · 0 评论 -
ZOJ 1642 Match for Bonus
最长公共子串问题理解的话。这个就不是问题了。水……zoj这种题目好多,都没有说数据范围……只能拼rp。。。。#include #include #include using namespace std;#define N 4050int a[300];int f[N][N], n, m;char s1[N], s2[N];int main() { int t原创 2013-05-05 18:38:26 · 1167 阅读 · 0 评论