基本小算法
zhu_wei_jian
这个作者很懒,什么都没留下…
展开
-
匈牙利算法
匈牙利算法:格式说明输入格式:第1行3个整数,V1,V2的节点数目n1,n2,G的边数m第2-m+1行,每行两个整数t1,t2,代表V1中编号为t1的点和V2中编号为t2的点之间有边相连输出格式:1个整数ans,代表最大匹配数邻接矩阵-C#include#include intn1,n2,m,ans;intresult[101];//记录V2中的点转载 2011-11-14 10:29:18 · 302 阅读 · 0 评论 -
快速排序
#includeusing namespace std;int part(int *a,int l,int r){ int x=a[l]; int i,j,tmp; for(i=l,j=l+1;j { if(a[j] { i++; tmp=a[j];原创 2011-11-14 09:41:24 · 287 阅读 · 0 评论 -
k个元素的子集 C(n,k)
#include #include #define MAXSIZE 20#define LOOP 1void main(void){ int set[MAXSIZE]; int n; int k; int position; int i, j; char line[转载 2011-11-14 10:40:19 · 585 阅读 · 0 评论 -
求两个排好序的数组合并之后的中位数
void sort(int [], int);int median(int x[], int y[], int n){ int first_X = 0; /* lower element of x[] */ int first_Y = 0; /* lower element of y[] */ int转载 2011-11-14 11:07:57 · 899 阅读 · 0 评论 -
表示成两数的平方和(已知R,求X,Y,使X^2+Y^2=R)
两个指针一个从1开始递增,一个从sqrt(n)递减。int main(){ int n,x,y,sn; cin>>n; sn=sqrt(n); x=1,y=sn; while(xy) { if(x*x+y*y==n) x++,j--; if(x*x+y*yn)原创 2011-11-14 11:34:39 · 1104 阅读 · 0 评论 -
判断数组中有没有连续和为0
数组a[n],求出sum[i]=a[0]+……+a[i]。然后判断有没有sum[i]==sum[j] bool zero_sum(int*a,intn){ int i; for(i=1;in;i++) a[i]+=a[i-1]; sort(a,n); for(i=1;in&&a[i]==a[i-1];i++)原创 2011-11-14 12:33:40 · 666 阅读 · 0 评论 -
字符串匹配(模式匹配)KMP BM
text字符串中找到pat模式串。//KMP算法#include void setup(char pat[], int fail[]){ int length = strlen(pat); int i, j; fail[0] = -1; for (i = 1; i for (j=fail[i-1];原创 2011-11-14 13:21:18 · 486 阅读 · 0 评论 -
集合的所有分割
#include #include /* for malloc() */#define ALWAYS 1void display(int *, int);void set_partition(int n){ int *code, *maxi; /* arrays for code[], maxi[转载 2011-11-14 10:41:21 · 472 阅读 · 0 评论 -
整数的分割数目
//只是输出分割的数目unsigned long compute(int, int);unsigned long int_part_no(int);unsigned long int_part_no(int n){ return compute(n, n); /* convert to another form */}/* -------------转载 2011-11-14 10:43:41 · 629 阅读 · 0 评论 -
三个已排序的数组a,b,c,求i,j,k使a[i]=b[j]=c[k]
for(i=j=k=0;in&&jm&&kl;) if(a[i]b[j]) i++; else if(b[j]c[k]) j++; else if(c[k]a[i]) k++; else output(i,j,k),exit;原创 2011-11-14 11:26:46 · 795 阅读 · 0 评论 -
堆排序
#includeusing namespace std;void adjustHeap(int *a,int i,int n){ int ch,tmp; while(i*2+1n) { ch=i*2+1; if(ch+1n&&a[ch]a[ch+1]) ch+=1; if(a[原创 2011-11-10 15:22:44 · 259 阅读 · 0 评论 -
指数计算 m^n (可以扩展到矩阵的n次方)
原理: m^n= 1 (n==0) =(m^k) (n==2k) =m*m^2k (n==2k+1) ///////代码//递归方式unsigned long recursive_power(unsigned long m, unsigned long n){ unsigned long temp; if (n ==原创 2011-11-14 10:50:31 · 1599 阅读 · 0 评论 -
列出所有子集(二进制递增方式)
#include #include #define MAXSIZE 20#define LOOP 1void main(void){ char digit[MAXSIZE]; int i, j; int n; char line[100]; printf("\nDirect Genera转载 2011-11-14 10:34:48 · 704 阅读 · 0 评论 -
归并排序
#includeusing namespace std;int b[1000];void merge(int *a,int l,int r) //Shell排序{ if(lr) { int m=(l+r)/2; merge(a,l,m); merge(a,m+1,r); //copy原创 2011-11-14 09:39:59 · 280 阅读 · 0 评论 -
希尔排序
#includeusing namespace std;void Shell(int a[],int n) //Shell排序{ int i,j,gap,tmp; for(gap=n/2;gap>0;gap/=2)//要确保gap能取到1 {//步长为gap的插入排序 for(i=gap;i {原创 2011-11-14 09:41:52 · 328 阅读 · 0 评论 -
列出所有子集(字典顺序)
#include #include #define MAXSIZE 20#define LOOP 1void main(void){ int set[MAXSIZE]; int n, i; int position; char line[100]; printf("\nAl转载 2011-11-14 10:36:01 · 613 阅读 · 0 评论 -
列出所有子集(格雷码顺序)
#include #include #define MAXSIZE 20#define YES 1#define LOOP 1#define FLIP_DIGIT(x) x = ((x) == '0' ? '1' : '0')#define FLIP(x) x = (1转载 2011-11-14 10:37:06 · 532 阅读 · 0 评论 -
列出所有排列(旋转法)
#include #include #define MAXSIZE 20#define ROTATE(p) { int i, temp; \ temp = perm[p]; \ for (i = p-1; i >= 0; i原创 2011-11-14 10:38:20 · 508 阅读 · 0 评论 -
列出所有排列(字典顺序)
#include #include #define LOOP 1#define SWAP(a,b) { int t; t = a; a = b; b = t; }#define REVERSE(a,b) { int i, j; \ for (i=(a)转载 2011-11-14 10:39:18 · 500 阅读 · 0 评论 -
求出和为固定值的所有连续整数
给定和为n,两个指针 l、r从0到n扫描, 记录sum=a[l]+……+a[r]。if sumn l++; if(sum==n) output, r++,l++;#include #include void main(void){ long left, right; /* left and right bound */ lon原创 2011-11-14 11:00:10 · 556 阅读 · 0 评论 -
求解gcd(a,b)=ax+by (扩展欧几里得算法)
欧几里德算法用来求两个数的最大公约数的算法。具体如下int gcd(int a,int b){ if(b == 0) return a; return gcd(b,a%b); }扩展欧几里德算法(求解gcd(a,b)=ax+by )分析:ax1+by1=gcd(a,b) =gcd(b,a%b)=bx2原创 2011-11-15 20:34:30 · 2502 阅读 · 0 评论 -
常见算法简介
A*搜寻算法,俗称A星算法: 在此算法中,g(n)表示从起点到任意顶点n的实际距离,h(n)表示任意顶点n到目标顶点的估算距离。 因此,A*算法的公式为:f(n)=g(n)+h(n)。Dijkstra 算法:算法解决的是有向图中单个源点到其他顶点的最短路径问题。原创 2011-12-20 19:23:11 · 621 阅读 · 0 评论