摘要: #include "iostream"#include "cstdio"#include "cstring"#include "queue"#include "algorithm"using namespace std;#define mem(a,y) memset(a,y,sizeof(a))#define inf 0x7f7f7f7fconst int maxn = 1100;const int maxm = 30000;struct node{ int v,len,next;}edge[m 阅读全文
posted @ 2013-09-30 19:43 一生挚爱 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 问题:n个点,对于每个点i,都有一条连向i+1的有向边,另外有m条其他的有向边,有q个询问(u,v)求u到v的最短路将m条有向边和q个询问对所表示的点对一起排序,(u,v)u大的排前,u一样的v小的排前,u和v一样大的先处理插入的再处理询问的;边插入边询问;树状数组里存的是右端点在v之后的询问的结果的差值(1)对于(u,v)uv) 的那些还没插入,树状数组存mat[u1][v1]-(d[v1]-d[u1])的最小值,查询时在加上(d[v]-d[u])(2)对于(u,v)u>v的这种边,保证在查询到(u,v)之前,所有(u2,v2) v2#include #include #include 阅读全文
posted @ 2013-09-13 20:47 一生挚爱 阅读(217) 评论(0) 推荐(0) 编辑
摘要: /*** 日期: 2013-9-12** 题目大意:有n个数,划分为多个部分,假设M份,每份不能多于L个。每个数有一个h[i],** 每份最右边的那个数要大于前一份最右边的那个数。设每份最右边的数为b[i],** 求最大的sum{b[i]² - b[i - 1]},1≤i≤M,其中b[0] = 0。** 思路:朴素DP为,dp[i]表示以i为结尾的最大划分。那么dp[i] = max{dp[j] - h[j] + h[i]²},** 1≤i-j≤L,h[j]<h[i]。这种会超时,采取线段树优化。因为有两个限制,考虑到若h[j]≥h[i],** 那么求i的时候一定不会用到j 阅读全文
posted @ 2013-09-12 15:26 一生挚爱 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 给定一个有向图,问最少增加多少条边后变成强连通图 tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0, 否则为缩点后点入度和出度的最大值, 证明:当入度或者出度不为0时,则可以通过传递性使其相同,所以只需要考虑入度或者出度为0的点 即可。因为要求增加尽量少的边,所以将入度和出度都为0的点相连,边的方向为出度为0的指向入度为0的顶点。 当入度为0或者出度为0的点有剩余时,则任意取一个点进行连边。 所以当有向图为强连通图时答案为0,否则最小值为入度和入度的最大值#include #include #include #include using names... 阅读全文
posted @ 2013-09-04 20:42 一生挚爱 阅读(687) 评论(0) 推荐(0) 编辑
摘要: http://www.cnblogs.com/looker_acm/archive/2010/08/15/1799919.html/*** 混合图欧拉回路** 只记录各定点的出度与入度之差,有向边无用丢弃,将无向边定向,在网络中建立流量为1的边** 另新建s和t。对于入 > 出的点u,连接边(u, t)、容量为x,对于出 > 入的点v,连接边(s, v),** 容量为x(注意对不同的点x不同)。之后,察看是否有满流的分配,如果是满流则存在,否则不存在*/#include #include #include #include #include using namespace std; 阅读全文
posted @ 2013-08-29 10:31 一生挚爱 阅读(151) 评论(0) 推荐(0) 编辑
摘要: (1)为了运用stack,你必须包含头文件:#include (2)在头文件中stack定义如下: namespace std{ template > class stack; } 第一个template参数代表元素型别,带有默认值的第二个参数用来定义stack内部存放元素所用的实际容器,缺省采用deque。之所以采用deque而非vector,是因为deque移除元素时会释放内存并且不必在重新分配时复制全部元素。实际上stack只是很单纯的把各项操作转化为内部容器的对应调用,你可以使用任何序列式容器来支持stack,只要它们支持back(),push_back(),pop_back() 阅读全文
posted @ 2013-08-28 16:05 一生挚爱 阅读(455) 评论(0) 推荐(0) 编辑
摘要: (1)使用set/multiset之前必须包含头文件:#include (2)namespace std{ template , class Allocator = allocator > class set; template , class Allocator = allocator > class multiset; } 只要是assignable、copyable、comparable的型别T都可以成为set或multiset的元素型别。 set/multiset的排序准则必须是strict weak ordering其意义是:1必须是反对称的,对判断式op而言,如果op( 阅读全文
posted @ 2013-08-28 16:04 一生挚爱 阅读(282) 评论(0) 推荐(0) 编辑
摘要: (1)为了运用priority_queue,你必须包含头文件:#include (2)在头文件中priority_queue定义如下: namespace std{ template , class Compare = less > class priority_queue; } 第一个template参数代表元素型别,带有默认值的第二个参数用来定义priority_queue内部存放元素所用的实际容器,缺省采用vector。第三个参数定义出“用以搜索下一个最高优先元素”的排序准则,缺省下是以operator <作为比较标准。实际上priority_queue只是很单纯的把各项操作 阅读全文
posted @ 2013-08-28 16:03 一生挚爱 阅读(186) 评论(0) 推荐(0) 编辑
摘要: (1)使用map/multimap之前必须包含头文件:#include 并且和所有的关联式容器一样,map/multimap通常以平衡二叉树来完成 (2)namespace std{ template , class Allocator = allocator > > class map; template , class Allocator = allocator > > class multimap; } 第一个template参数被当作元素的key,第二个当作元素的value。key/value必须具备assignable和copyable性质,对排序而言key必 阅读全文
posted @ 2013-08-28 16:02 一生挚爱 阅读(277) 评论(0) 推荐(0) 编辑
摘要: (1)要运用STL的算法,首先必须包含头文件,某些STL算法用于数值处理,因此被定义于头文件(2)所有STL算法都被设计用来处理一个或多个迭代器区间,第一个区间通常以起点和终点表示,至于其他区间,多数情况下你只需提供起点便足以,其终点可以自动以第一个区间的元素数量推断出来,调用者必须保证这些区间的有效性。STL算法采用覆盖模式而非安插模式,所以调用者必须保证目标区间拥有足够的元素空间,当然你也可以运用特殊的安插型迭代器将覆盖模式改变为安插模式。(3)尾词_if:如果算法有两种形式,参数个数都相同,但第一形式的参数要求传递一个值,第二形式的参数要求传递一个函数或仿函数,那么尾词_if就派上了用场 阅读全文
posted @ 2013-08-28 16:01 一生挚爱 阅读(175) 评论(0) 推荐(0) 编辑