写在前面
我发现用java 做复杂算法题的人真的很少很少,其实Java是一门很优秀的语言,利用好Java的特性,java的自带的一些方法(函数)可以帮助我们快速实现一些复杂的复杂的算法。
c++与java在算法竞赛的感觉对比
c++ 优点:好些!简洁!"听话"的语言(它的每一步操作我们大致知道发生了啥的)。
c++ 缺点: C++除了高精度稍微不方便以外就没有别的缺点了
Java优点:有大整数类!。Java能运行js代码,可以做一些求“1*2+3/4”这样的题。能进制转换!
Java缺点:Java除了有高精度以外都是缺点,内存大,耗时。java写代码不爽。java没有运算符重载,读个vector、map还要get、set的。java有宏吗?有人能背诵一下java的输入输出流重定向的代码吗?java也不像python、ruby、perl这三小流氓一样能用一两行写完简单题,自然吸引力不大。
STL
c++ | java |
---|---|
priority_queue | PriorityQueue |
queue | Queue |
stack | Stack |
Map | HashMap |
set | Set |
vector | Vector |
bitset | Bitset |
一些常见的写法
排序p数组(下标从1开始)第a个元素到第b个元素排序
c++ :sort(p+1+a,p+1+b)
java :Array.sort(p,a,b)
在类或者结构体上定义排序按照a从小到大排序如果a一样大那么按照b从大到小排序
c++
struct node{
int a,b;
bool operator <(conts node &A){
return a<A.a||(a==A.a&&b>A.b);
}
};
java
class node implements Comparable<node>{
int a,b;
int compareTo(node A){
if(a<A.a) return -1;
else if(a==A.a&&b>A.b) return -1;
else return 1;
}
}
一些有用的算法模板(java版)
java 所具有的大整数用法
题目案例:求
A
B
m
o
d
P
A^BmodP
ABmodP
这里还有自带快速幂方法,舒服。
用c++自己实现一个大整数结构体挺累的,如果模数不是很大的话写个快速幂+龟速乘就可以通过了
CODE
spfa判断负环路模板
这里要用到Quque库,具体操作还是spfa用法
pell 返回队头
poll 弹出队头
add 添加元素到队列
CODE
最小生成树
在类上面接上一个Comparable 接口就可以按照某个值排序了
CODE
dijkstra最短路算法
时间复杂度
N
l
o
g
N
NlogN
NlogN
CODE
处理1~n的逆元
CODE
树状数组
树状数组是一个轻便的维护区间的一种技巧,很好写。
CODE
矩阵快速幂
矩阵快速幂可以加速式子的递推
这个代码求
A
k
A^k
Ak
CODE
最近公共祖先
顾名思义:就是树上的一些的离他们最近的公共祖先节点。
CODE
Johnson 全源最短路
Johnson 和 Floyd 一样,是一种能求出无负环图上任意两点间最短路径的算法。该算法在 1977 年由 Donald B. Johnson 提出。
适用于边数较少点数较多的图,时间复杂度
n
m
l
o
g
m
nmlogm
nmlogm
CODE
二分图最大匹配
给定一个二分图,其左部点的个数为n,右部点的个数为m,边数为e,求其最大匹配的边数。
CODE
线段树
线段树可以在nlogn维护区间的信息,对于区间可加性的维护很强。
CODE
树链剖分
它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、BST、SPLAY、线段树等)来维护每一条链。
CODE
网络最大流
dinic 方法
CODE
最小费用最大流
SPFA方法
CODE