前段时间学习算法写的一些伪代码

并查集

  • 用途:找图的回路
  • Arrays.fill(dset,-1)
  • 合并树根,原图的关联丢失
dset:[n] @fill(-1)
roota=root(a)
rootb=root(b)
if(a!=b)
  dset[b] = a //合并
else
  ... //节点在相同集合时
root(l) =>
  while(dset[l]!=-1)
    l = dset[l]
  return l

费马小定理

a * a(-1)=1(%mod)

a(-1)=a(mod-2)%mod

年份

闰年判断条件

isLeap(y) =>
  (y % 4 == 0 && y % 100 != 0) || y % 400 == 0

质数

  • 互质的两个数最大凑不出的数为a * b - (a + b),个数为(a - 1) * (b - 1) / 2。

全排列

a:[len]
f(k) =>
  if(k==len) ...;return; //check
  for(i=k;i<len;i++)
    t=a[i];a[i]=a[k];a[k]=t; //swap
    f(k+1)
    t=a[i];a[i]=a[k];a[k]=t; //reswap
f(0)

抓取法(无重复组合)

a:[len] @sorted
path:[len]
vis:bool[len]
f(k) =>
  if(k==len) ...;return; //check path
  for(i=0;i<len;i++)
    if(i>0 && a[i] == a[i-1] && !vis[i-1])
      continue
    if(!vis[i]) //没有用过的元素可以抓入path
      vis[i] = true
      path[k] = a[i] //catch
      f(k+1)
      vis[i] = false
f(0)
  • 当前元素和上一元素相同 且 上一元素未被抓取 则跳过。

DFS

  • 提前剪枝

快速幂

pow(a, n) =>
  if(a == 0) return 0
  ans = 1
  while(n > 0)
    if((n & 1) == 1)
      ans = ans * x % MOD
    n >>= 1
    a = a * a % MOD
  return ans

拓扑排序

拓扑图,无向图就add两遍。

n //节点个数
idx //边的id
e:int[n*2] //edge
h:int[n] @fill(-1) //head
ne:int[n*2] //next edge
d:int[n] //节点的入度
add(a, b) =>
  e[idx] = b
  ne[idx] = h[a]
  h[a] = idx++
  d[a]++

遍历所有a指向的节点

for(i = h[a]; i != -1; i = ne[i])
  t = e[i]
  ...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值