算法学习
千灵域
腾讯WXG数据开发,主要进行golang、C++程序的开发,并协助维护Spark和Flink任务。博客会在工作之余侧重其他内容,主要集中在编程知识上。
个人博客的gitpage:https://www.challengefilter.com/
展开
-
floyd-warshall算法【学习中】
今天做题时接触到了这个算法 概述:(转自百度百科)单独一条边的路径也不一定是最佳路径。 从任意一条单边路径开始。所有两点之间的距离是边的权的和,(如果两点之间没有边相连, 则为无穷大)。 对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。 不可思议的是,只要按排适当,就能得到结果。// dist(i,j) 为从节点i到节点转载 2013-11-21 21:40:57 · 610 阅读 · 0 评论 -
匈牙利算法(4次方级)
int W[maxn][maxn],n;int Lx[maxn],Ly[maxn];//顶标int left[maxn];//left[i]为右边第i个点的编号bool S[maxn],T[maxn]; //S[i]和T[i]为左或右第i个点是否已经被标记bool match(int i)//寻找从i出发的对应项出的可增广路{ S[i]=true; for(int转载 2014-04-24 21:39:09 · 482 阅读 · 0 评论 -
对于A*算法的学习(启发式搜索)
转自http://www.cnblogs.com/yanlingyin/,一篇转载 2014-05-11 14:16:43 · 4472 阅读 · 0 评论 -
【图论】最小环算法
做vijos1046时想最小环想了半天,还是转载 2014-05-19 21:12:00 · 3878 阅读 · 0 评论 -
二分图带权匹配 KM算法与费用流模型建立
转自http://hi.baidu.com/lerroy312/item/42e718ba58a1f8df85dd795f[二分图带权匹配与最佳匹配]什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小。而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大或最小。二分图的带权匹配与最佳匹配不等价,也不互相包含。我们可以使用转载 2014-06-22 21:09:17 · 503 阅读 · 0 评论 -
逆序对的递归求法
int cnt=0; // 逆序对个数int a[100002], c[100002];void MergeSort(int l, int r) // r=右边界索引+1{ int mid, i, j, tmp; if (r>l+1) { mid = (l+r)/2; MergeSort(l, mid); MergeSort(mid, r);转载 2014-10-27 21:43:15 · 755 阅读 · 0 评论 -
常用算法时间复杂度表
常见的数量级大小:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)数量级能承受的大致规模常见算法O(1)任意直接输出结果O(logn)任意二分查找、快速幂O(n)以百万计(五六百万)转载 2014-10-15 21:55:36 · 1099 阅读 · 0 评论 -
高精度重载运算符的C++代码
高精度算法(压位存储)!有的时候,数字会大到连long long都不能承受的程度。这时,我们可以自己模拟大数的各种运算。所谓压位存储,就是在高精度数内部采用10000进制(即每四位放到一个数中)进行存储。它与10进制(即一个数位对应一个数)相比速度要快一些。高精度数内部也可以采用100000000进制,但是这样就不能计算乘除法了。(1) 定义编程时这样做——假设hp是高精度类型转载 2014-11-03 16:36:07 · 2053 阅读 · 0 评论 -
【算法学习】强连通分量
今天意外的发现了强连通分量这个神奇的东西。#include#include#include#includeusing namespace std;const int maxn=10000;struct Edge{ int from,to,d;};vector edges;vector G[maxn]; int n,m;int flag[maxn];int color原创 2014-11-04 15:18:18 · 305 阅读 · 0 评论 -
【算法学习】扩展欧几里得算法
//求整数x,y使得ax+by=dint extendgcd(int a,int b){ int t; if(b==0) { x=1,y=0; return a; } t=x,x=y; y=t-(a/b)*y; return extendgcd(b,a%b);}原创 2014-11-04 16:42:11 · 350 阅读 · 0 评论 -
【C++】n皇后问题
今天参加了郭崇山老师的练习赛,结果连第一道题都没做出来,尼玛十万级别的n皇后问题我说实在是不会啊……google了一下题解发现要用到遗传算法还有CSP最小冲突法什么的(http://blog.csdn.net/u013390476/article/details/50011261)心好累啊,把自己代码贴出来歇会先。 首先是用朴素的回溯法做的,毕竟好久没碰了,做出来先//version 1回溯#i原创 2016-12-03 20:42:14 · 1549 阅读 · 0 评论 -
完全背包问题思考与学习
//完全背包问题/*有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 关键是无限件数*/#include#include#include#define MAXN 100int main(void){ int i,j,k;原创 2014-03-26 21:52:56 · 474 阅读 · 0 评论 -
大整数操作(加、减和未完成的乘法)
原来的代码不见了,又得重新补一遍……原创 2014-04-06 17:28:58 · 432 阅读 · 0 评论 -
【高精度计算】《算法竞赛入门经典》bign类型运算符重载
#include#includeusing namespace std;const int maxn = 200;struct bign{ int len, s[maxn]; bign() { memset(s, 0, sizeof(s)); len = 1; } bign(int num) { *this = num; } bign转载 2013-12-10 21:24:44 · 656 阅读 · 0 评论 -
【枚举排序】生成可重集排序
#include#include#define MAXN 10void qsort(int a[], int l, int r){ if(l>=r) return; int i=l, j=r, x=a[(i+j)>>1]; a[(i+j)>>1] = a[i]; a[i] = x; do{ while(i= x) j--; if(i<j) {a[i] = a[j]; i+转载 2013-12-10 21:39:24 · 545 阅读 · 0 评论 -
学习kruskal
伪代码: 把所有边排序,记第i小的边为e[i] (1 初始化最小生成树为空 初始化连通分量,让每一个点自成连通分量 for(int i=0;i { if(e[i].u与e[i].v不在同一个连通分量) { 把边e[i]加入到最小生成树中 合并e[i].u和e[转载 2013-12-03 21:51:39 · 556 阅读 · 0 评论 -
【枚举排列】字典序输出
//《算法竞赛入门经典》P117思考#include#include#define MAX 50//递归实现字典序排列 void print_permutation(int n,int *A,int cur)//n为元素数量,A为用来递归调用的数组,cur为数组标号{ int i,j; if(cur==n) { for(i=0;i<n;i++) printf("%转载 2013-12-10 21:36:14 · 712 阅读 · 0 评论 -
【回溯】困难的串
《算法竞赛入门经典》P128 复习如果一个字符串包含两个相邻的重复字串,则称它是“容易的串”,其他串称为“困难的串”。例如,BB,ABCDACABCAB,ABCDABCD都是容易的,而D,DC,ABDAB,CBABCBA都是困难的。输入正整数n和L,输出由前L个字符组成的,字典序第k小的困难的串。例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,A转载 2013-12-11 20:54:31 · 855 阅读 · 0 评论 -
【动态规划】【RQNOJ】第2题 开心的金明 C源码
#include#include#define MAX 30000+1int main(void){ int v[25+1]; int p[25+1]; int num[MAX]={0}; int number,money; int i,j; scanf("%d %d",&money,&number); for(i=原创 2013-12-05 21:41:23 · 661 阅读 · 0 评论 -
dijkstra算法原理概述
dijkstra,多源最短路径1.原始版(n方)distance数组、intree数组、parent数组 首先将所有的数组初始化将始点纳入到树中(到树的距离为0) 并赋intree 为true 遍历该点的所有边,更新其到树的最小距离 搜索所有的点,找到距离树最小的点将该点纳入树中,开始下一轮循环直到所有点都被纳入到树中2.优先队列优化原创 2014-03-17 21:25:51 · 1113 阅读 · 0 评论 -
Bellman-ford算法学习与SPFA算法
用途:1.判断负权环。2.在存在负权边的情况下计算单源最短路径时间复杂度约为O(nm)可用队列优化,队列实现:SPFA,时间复杂度O(kE)伪代码(转自nocow):设Dist代表S到I点的当前最短距离,Fa代表S到I的当前最短路径中I点之前的一个点的编号。开始时Dist全部为+∞,只有Dist[S]=0,Fa全部为0。维护一个队列,里面存放所有需要进行迭代的点。初始时转载 2014-03-19 21:39:12 · 656 阅读 · 0 评论 -
动态规划学习
动态规划:(dynamic programming)知识点:枚举(状态)+递推(状态转移方程)1.最长不下降子序列(LIS) 对于给定序列S={a1,a2……,an} 有一个子序列满足ai1DP方程设f[i]为前i个数中的最大不下降子序列的长度则f[i]=1(i=1) f[i]=max{f[j]+1},当j PS:最长不上升子序列则f[i]=1原创 2014-03-20 21:47:34 · 444 阅读 · 0 评论 -
dd大牛的背包九讲
P01: 01背包问题 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程转载 2014-03-20 21:51:09 · 492 阅读 · 0 评论 -
对全排列问题的思考
嗯,最近看到了C++algorithm中的两个函数next_permutation与prev_permutation,实现了一下发现思路都不是很清晰,谷歌了一下看到了这篇文章,收藏一下。 原文地址:http://www.cnblogs.com/cobbliu/archive/2012/05/30/2525778.html一、消重的字符串全排列算法,递归void swap(char* x, char转载 2016-12-15 18:45:56 · 265 阅读 · 0 评论