ACM
CallMeJiaGu
个人博客:https://www.callmejiagu.com/
展开
-
Algorithm 并查集的粗劣想法(易懂)
这里我自己说一下我自己学的感受吧 。int findset(int a) //不带路劲压缩 { while(pa[a] != a) { a = pa[a]; } return a; } void union_nodes(int a, int b) //集合合并 {原创 2014-07-31 09:17:24 · 558 阅读 · 0 评论 -
Algorithm 二分匹配的 基本信息的解释
在学习二分匹配的时候难度在于许多的概念不理解,阻碍我们学习的进程。所以要先明白这些概念都是什么。首先我先给出三个重要的公式。1:最大独立集 = N - 最大匹配数 。(N是所有的顶点数)2:最小点覆盖 = 最大匹配数 。3:最小路径覆盖 = 最大独立集 。下面我会一一解释 这些概念 。 先付上一张简单的图。先看最大匹配数是什么 。 通俗的讲就是在 左边和右边 各找一点 有连原创 2014-07-31 09:27:01 · 456 阅读 · 0 评论 -
Algorithm 几种排序的时间复杂度的分析
1.选择排序:不稳定,时间复杂度 O(n^2) 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。 2.插入排序:稳定,时间复杂度 O(n^2) 插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]转载 2014-07-31 09:30:33 · 840 阅读 · 0 评论 -
Algorithm KMP简单的代码
在看了两三天的KMP,我觉得主要的难点在于,不理解next是什么东西,有什么用。说的明白点就是next【i】就表示从i这个点之前有几个点和从第一个点开始的字符是一样的。位置 0 1 2 3 4 5 6 7 8 9 10 11 12 1314 15next【i】-1 0 0 0 0 1 2 3 1 2 3 4 5 6 7 4原创 2014-07-31 09:31:04 · 436 阅读 · 0 评论 -
Algorithm A*算法
在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法。启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。估价函数:从当前节点移动到目标节点的预估费用;这个估计就是启发式的。在寻路问题和迷宫问题中,转载 2014-07-31 09:31:46 · 1422 阅读 · 0 评论 -
Algorithm 简单优先队列
#include#include#include#includeusing namespace std ;#define MAXN 5 //先是最简单的优先队列 priority_queue q ;//如果我什么都没有定义就这样写的话 //这个优先队列会按照从大到小排序int main(){ int len[MAXN]原创 2014-07-31 11:12:09 · 400 阅读 · 0 评论 -
Algorithm 矩阵的运算 HDU 1757
Problem DescriptionLele now is thinking about a simple function f(x).If x If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);And ai(0Now, I will give a0 ~ a9 a转载 2014-08-01 16:11:28 · 521 阅读 · 0 评论 -
Algorithm 母函数
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////生成函数是说,构造这么一个多项式函数g(x),使得x的n次方系数为转载 2014-08-02 10:48:00 · 360 阅读 · 0 评论 -
Algorithm 字符串的最大对称长度
//加CTRL + Z 来结束#include#include#includeusing namespace std ;//check里的int check(string str , int i){ int len = str.length() ; int low , high , max1 = 1 , max2 = 0 ; low = i-1 , high = i + 1原创 2014-08-07 14:45:10 · 488 阅读 · 0 评论 -
Algorithm Counting Ones 数学规律 PAT 1049
题意:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。分析:一个最简单的方法来计算f(N),那就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,自然就得到了从1到N所有“1”的个数的和。但是这个算法的致命问题是效率,它的时间复杂度是O(N)×计算一个整数数字里面“1”的个数的复杂度 = O(N * log2 N)转载 2014-08-13 16:08:41 · 809 阅读 · 0 评论 -
Algorithm 二分匹配 最大的匹配数 (简单)
其实像这个求最大的匹配数的代码还是蛮简单的, 如果你会网络流那么理解起来更加方便了,不懂也没事,你可以自己画一张简单的图,把下面的过程模拟一遍 ,就知道是怎么求找了。下面的代码给出了详细的解释。 linker[i] = x ; return true ; } } } re原创 2014-07-31 09:23:51 · 550 阅读 · 0 评论 -
Algorithm 网络流最大流(代码)(Edmond-Karp算法)
这里有用到了PRE的数组,该数组的作用和静态邻接表的原理是一样的。能减少时间复杂度。详细的解释在上篇文章写到了。int c[MAX][MAX]; //残留网络容量int pre[MAX]; //保存增广路径上的点的前驱顶点bool visit[MAX];int Ford_Fulkerson(int src,int des,intn){ //src:源点 des:汇点n:顶点转载 2014-07-31 09:22:54 · 1510 阅读 · 0 评论 -
Algorithm 最短路径 简单的代码
看了这些代码之后 总结了一下 其实就那三个for 循环 一:找与v有连接的点 。二:从这些连接的点找到最小,把他看成是下一次的v 。 三: 你要把有出现的那些边 更新掉。 详解在代码里写出了 #include#include#includeusing namespace std ;#define N 100#define M 100typedef struct no原创 2014-07-31 09:16:04 · 448 阅读 · 0 评论 -
Algorithm 并查集的 路径压缩(递归和非递归)
这里的思路是在每一次的找父亲节点的时候我们把每一个孩子的父亲的改成他的祖先。因为有可能一个孩子的关系很复杂可能就是一条链,这样查找就没浪费时间。这是简单find (int x){ while(x!=father[x]) father[x] = find(father[x]) ; return father[x] ;}//这是非递归的find (int x){ i原创 2014-07-31 09:15:41 · 1364 阅读 · 0 评论 -
Algorithm 最短路径之 SPFA
SPFA 是ford算法的优化版。 这个算法 需要用到一个静态的邻接表,还有一个队列。主要有三部分 一:Aadedge需要把边以静态邻接表的形式保存下来 。二:inti 初始化 。在初始化的过程中 要把pre【】=== -1,dist【】=== INF。然后输入边的信息。调用Addedge(x , y ,w).。三:SPFA 这个过程 一开始的时候将start 1 push(1)。通过(j原创 2014-07-31 09:11:16 · 447 阅读 · 0 评论 -
Algorithm 优先队列来处理的 最短路径
看了好久终于看懂了 ,首先你要知道 优先队列在这里的作用是什么。在Djsktra的算法中 我们需要有三个for其中有个for是要找到 连接中最小的点 并且返回该点 ,这里的优先队列把这个for循环替掉。/*typedef pair pii;priority_queue q; 这个优先队列是根据 pair中的first来 从小到大排的。这里的pair中的first的值就是dist 所原创 2014-07-31 09:11:14 · 581 阅读 · 0 评论 -
Algorithm 最短路径算法ford
看了看最短路径的ford算法,刚看时并没有看懂,我一直想不明白的是在迭代的过程中,每一次都要把每条边,进行松弛(就是判断dist[i]与dist[v]+w[v][i]的情况),我开始的认为是只需要一次的迭代就可以解决的,为什么需要n-1次呢,而且有那么一句话是这样说的,第一次迭代是把将与V0有连接的第一层得到最小值,第二次是将距离V0两条边的点求出来。。。其实在if(dis[edge[原创 2014-07-31 09:10:28 · 579 阅读 · 0 评论 -
Algorithm 最短路径之 Dijkstra的优化
Dijkstra算法利用了优先队列,也用到了静态邻接表。主要也是有两部分组成。一: 当然是初始化。将dist和pre分别赋值 ,然后输入各条边的信息,存储在静态邻接表中 。二: 中Dijkstra中 将Q.push(temp) .然后利用for(i = pre[nod] ; i != -1 ;i = edge[i].next )将每条与temp有关联的边进行遍历。能松弛的点push到Q中。详细看下原创 2014-07-31 09:04:53 · 511 阅读 · 0 评论 -
Algorithm 最短路径之 floyd (适用于 多点距离)
#include#include#include#include#includeusing namespace std ;#define MAXN 1000#define INF 1000000int map[MAXN][MAXN] ;int visit[MAXN] ;int pre[MAXN] ;int dist[MAXN] ;int path[MAXN] ;in原创 2014-07-31 09:04:38 · 665 阅读 · 0 评论 -
Algorithm 最小生成树 prime算法
简单的prime 算法 主要的就是三个部分。一 用dist来记录值,二 找dist 里的最小值,三 更新dist里的值。所以要写prime算法 要抓住这三个点来写,就能减少错误。(visit用来标记,在判断条件的时候不要忘了)#include#include#define INT_MAX 1000000#define MAXN 100int visit[MAXN] ;int m原创 2014-07-31 09:03:24 · 686 阅读 · 0 评论 -
Algorithm 最小生成树之 Kruskal
个人观点,较prime算法,Kurskal算法更加的简单,这里我们只需要每一次去需找权值最小的那条边就好,在这里我们先可以利用sort进行快排,得到权值最小的map[i] 。 得到该条边的两个节点map[i].u 和map[i].v,这时候你需要判断能不能用这条边,因为最小生成树是不能形成回路,所以用到了 并查集的方法,可以快速的判断这两个点是否满足条件。如果不存在关系那么那么就把这条边加入,反之原创 2014-07-31 09:00:39 · 503 阅读 · 0 评论 -
Algorithm 素数的高效判断
#include#include#define N 10000bool prime[N];int main(){ int i, j; for(i=2; i if(i%2) prime[i]=true; else prime[i]=false; for(i=3; i { if(prime[i])原创 2014-08-19 09:56:10 · 395 阅读 · 0 评论 -
Algorithm 鸡蛋的硬度问题
IMNU OJ 1253--鸡蛋鸡蛋Time Limit:1000MS Memory Limit:65536KDescriptionGardon有一些鸡蛋,他现在想知道这些鸡蛋的硬度。Gardon的家住在一座很高很高的大楼里,他现在要在这座大楼上测试鸡蛋的硬度。每个鸡蛋的硬度相同,鸡蛋的硬度定义为:如果鸡蛋从第m层上掉下来没有破裂,而从第m+1层上掉下来就破裂了,那么这个鸡蛋转载 2014-12-27 16:48:50 · 1028 阅读 · 0 评论 -
Algorithm 建二插树的时候结点链接的问题
(1)方法建树 void insert(node* ptr_node , int data){//插入节点 node* temp_node = new node ; if(head_flag){ ptr_node->value = data ; head_flag = 0 ; }else{ while(ptr_node){ temp_node = ptr_node原创 2015-01-14 16:18:41 · 712 阅读 · 0 评论 -
Algorithm 关键路径算法 PAT How Long Does It Take (25)
#include#include#include#include#includeusing namespace std ;#define MAXN 100 int map[MAXN][MAXN] ;int in_cout[MAXN] ;int e_time[MAXN] ;int arry[MAXN] ;int n , e , n_s = 1 ,sum ;int max(原创 2015-01-22 16:40:23 · 1533 阅读 · 0 评论 -
Algorithm DFS的初认识
题目:今天是阴历七月初五,acm队员zb的生日。zb正在和C小加、never在武汉集训。他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和 never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜。当他准备把西瓜送给C小加和never的时候,遇到了一个难 题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每原创 2015-01-25 10:35:38 · 425 阅读 · 0 评论