
经典算法
咚咚鼠说要一起旅行
这个作者很懒,什么都没留下…
展开
-
最长公共子序列(附C语言实现)
最长公共子序列 最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Substring)。其定义是,一个数列 S ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 动态规划的一个计算最长公共子序列的方法如下: 以两个序列 X、Y 为例子: 设有二维数组 f[i,j] 表示 X 的原创 2009-10-26 21:07:00 · 1268 阅读 · 1 评论 -
匈牙利算法(附C语言实现)
问题简介 设G=(V,E)是一个无向图。如顶点集V可分割为两个互不相交的子集V1,V2之并,并且图中每条边依附的两个顶点都分属于这两个不同的子集。则称图G为二分图。二分图也可记为G=(V1,V2,E)。 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。 选择这样的子集中边数最大的子集称为图的最大匹配问题(maxim原创 2011-10-23 08:43:05 · 4248 阅读 · 0 评论 -
最小费用最大流(附C语言实现)
#include//最小费用最大流 #includeusing namespace std;const int N=100;int map[2*N+2][2*N+2];//0为源点 1-n老师 n+1-2n类型 2N+1为汇点 保留的是边的权值(费用) int flow[2*N+2][2*N+2];//流量int path[2*N+2];//记录节点i在此次增广中的前驱原创 2011-10-25 19:13:22 · 420 阅读 · 0 评论 -
银河英雄传说(并查集)(附C语言实现)
<br />并查集不解释……<br />code:<br />#include<stdio.h>#include<memory.h>#include<math.h>int T;int *father;int *children;int find_father(int x){ while(father[x]!=-1)x=father[x]; return x;}//找到根节点 int find_children(int x){ while原创 2010-10-27 21:44:00 · 1784 阅读 · 1 评论 -
一笔画(欧拉回路)(附C语言实现)
<br />#include<fstream>using namespace std;ifstream fin("Problem.in");ofstream fout("Problem.out");const int N=501;int d[N];int map[N][N];int res[1000001];int k=0;int l=0;int n;void go(int v){ for (int i=1;i<=l;i++) {原创 2010-10-27 21:46:00 · 1156 阅读 · 0 评论 -
邻接表存储图的SPFA的C实现
<br />边类:<br />struct ArcNode{ ArcNode *nextarc; int a,b; int weight;}*E;//边集<br />点类:<br />struct node{ ArcNode *firstarc;}*V;//点集<br />Code:#include<iostream>using namespace std;const int oo=32767;struct ArcNode{原创 2010-10-13 12:06:00 · 885 阅读 · 0 评论 -
最短路径之SPFA算法的C实现
<br />写得很傻……<br />队列优化的BellmanFord算法<br />空间浪费很大,没用邻接表存储,写得很丑,将就着看吧<br />Code:<br />#include<iostream>#include<string>using namespace std;const int oo=2500;//最大的路径值const int Max_Node=2501;//最大边的条数 int n,m;//n点 m边int *D;int *queue;int begin;原创 2010-10-11 21:47:00 · 555 阅读 · 0 评论 -
最短路径之BellmanFord算法的C实现
<br />Code:<br /><br />#include<iostream>using namespace std;const int oo=1000000;int n,m;//n为点的个数 m为边的条数int begin,end;//begin为起始点 end为结束点struct bian{ int a,b; int w;}*E;int *D;int Ford(){ int i,j; for (i=1;i<原创 2010-10-06 20:46:00 · 658 阅读 · 0 评论 -
高精度乘法(不压位)(附C语言实现)
<br />高精度乘法<br />主要语句:<br />ans[x+y]+=num1[x]*num2[y];ans[x+y+1]+=ans[x+y]/10;ans[x+y]%=10;<br />没有压位,压位预处理比较麻烦,完成后上传~<br />不压位code:<br />#include<iostream>#include<string>using namespace std;string s1,s2;int l1,l2;int *num1,*num2,*ans;int原创 2010-10-02 23:52:00 · 726 阅读 · 0 评论 -
最长不下降子序列(附C语言实现)
#include#includeusing namespace std;int main(){ string s1,s2; cin>>s1>>s2; int i,j; int **ans=new int*[s1.size()+1]; for (i=0;i原创 2010-06-21 15:35:00 · 729 阅读 · 0 评论 -
最小生成树之Kruskal算法(附C语言实现)
<br />思路:贪心算法 快速排序->并查集<br />输入格式:n m(n为点的个数,m为边的条数)<br /> 然后m行,每行三个数字a,b,c<br /> a为边的权值,b和c为边的两个顶点<br />输出格式:一共n-1行,表示最小生成树的边<br /> 每行三个数字a,b,c<br /> a为边的权值,b和c为边的两个顶点<br />时间复杂度O(eloge)<br />//最小生成树 无向图 #include<iostre原创 2010-08-11 22:05:00 · 872 阅读 · 3 评论 -
堆排序(附C语言实现)
定义 n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ n) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字原创 2009-10-22 22:33:00 · 1911 阅读 · 0 评论 -
希尔排序(附C语言实现)
希尔排序是一种插入排序法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。 基本思想: 不断把待排序的对象分成若干个小组,对同一小组内的对象采用直接插入法排序,当完成了所有对象都分在一个组内的排序后,排序过程结束。每次比较指定间距的两个数据项,若左边的值小于右边的值,则交换它们的位置。间距d按给定公式减少: di+1 =(di +1)/2 ,直到d等原创 2009-10-15 22:43:00 · 7947 阅读 · 0 评论 -
二分搜索法(附C语言实现)
二分搜索法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第一个二分搜索算原创 2009-10-08 21:09:00 · 2348 阅读 · 0 评论 -
链表(附C语言实现)
链表 是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比较顺序结构,链表比较方便插入和删除操作。 线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这原创 2009-10-07 17:23:00 · 1175 阅读 · 1 评论 -
最短路径之Floyd算法(附C语言实现)
定义 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D原创 2009-10-07 18:04:00 · 7551 阅读 · 0 评论 -
快速排序(附C语言实现)
基本思想 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法过程 设要排序的数组是A[0]……A[N-1],首先任意选取一原创 2009-10-07 17:51:00 · 492 阅读 · 0 评论