摘要:
今天学的最小生成树,先放上这个裸的题。题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1233Prim算法View Code 1 #include<stdio.h> 2 #include<string.h> 3 int map[110][110],lowcost[110],visit[110]; 4 #define N 1000000 5 int prim(int maxminum) 6 { 7 int i,sum,j,k,min; 8 for(i=1;i<=maxminum;i++) 9 {10 lowco... 阅读全文
摘要:
欧几里德算法也就是一般说的辗转相除法。代码框架如下:int gcd(int a, int b) { return b ? gcd(b, a%b) : a;}粗略估计需要进行O(log b)次整数运算。实际上,当n固定后gcd(m, n)的平均迭代次数(m <= n)近视为(12*ln2 / π2)*ln(n) 。(不知道怎么证明的-_-!) 扩展欧几里德算法 设gcd(a, b) = d,则存在正整数x, y满足ax + by = d。算法框架int x, y;int ext_gcd(int a, int b) { if(b == 0) { x = 1; y = ... 阅读全文
摘要:
long long merge_sort(int l, int r) { int mid, p, q, i, j, len; if(l >= r) return 0; mid = (l + r) >> 1; len = r - l + 1; p = l; q = mid + 1; j = l; for(i = 0; i < len; ++i) { if((q > r) || (num[p] < num[q] && p <= mid)) { t[j++] = num[p++]; } else { ... 阅读全文
摘要:
下图说的很清楚,每次找入度为0的点,将其从序列中删掉,同时与它相连的所有点入度减一;实现代码,以HUD_1285为例:#include <iostream>#include <cstdio>using namespace std;const int N = 501;int map[N][N];int into[N], ans[N];void toposort(int x){ int i, j, k; for(i = 1; i <= x; i++) for(j = 1; j <= x; j++) if(map[i][j]) ... 阅读全文
摘要:
并查集(Union-Find Sets),字面意思理解——合并,查找。给出一个集合,将其合并后用一个点代替一个集合的元素。例如:1 22 34 3合并后就是 2 / \1 3 \ 4主要操作:1、查找。2、合并。查找方法见http://www.cnblogs.com/vongang/archive/2011/07/31/2122763.html合并实现方法如下:void Union(int root1, int root2){ int x = FindSet(root1), y = FindSet(root2); if( x == y ) return ; if( r... 阅读全文
摘要:
struct node{ int v; //边的结束顶点int w; //边的长度 node* next; //指向以同一起点的下一条边的指针}*first[N]; //first[u]指向以u为起始点的第一条边void init(){ memset(first,NULL,sizeof(first));}void add(int u, int v, int w)//添加边{ node* p =new node; p->v = v; p->w = w; p->next = fisrt; first[u] = p;}//使用的时候,找u的邻接点for(node* p... 阅读全文
摘要:
当对很大的数(比如100位)进行运算时,肯定不能c/c++内的数据类型直接运算(当然Java里的BigNumber可以。。。)这时就要用数组模拟运算过程。+, - ,*, /,运算貌似是小学学的东西,童鞋们,现在要用到小学的知识啦!!先说加法,大体的操作包括逆序、对位、求和、进位(其实就是小学的加法运算,不过是把数倒过来算,至于为什么要逆序。。。)例题:http://poj.grids.cn/practice/2981代码:#include <stdio.h>#include <string.h>#define MAX 200int an1[MAX+10];int an 阅读全文
摘要:
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i 阅读全文
摘要:
快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):1、取一个关键字;2、把序列中大于关键字的放在关键字右边;3、把序列中小于关键字的放在关键字左边;4、重复1-3步,直到序列有序;代码+注释:#include<stdio.h>#define N 100int QuickSort1 (int r[], int low, int high){ int key; key=r[low]; /*取轴值记录关键字*/ while(low<high) /*从表的两端交替地向中间扫描*/ { while(low<high && r[high]... 阅读全文
摘要:
二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。如图:链表实现(比较简单):View Code #include <stdio.h>#include <malloc.h>typedef struct node{ int data; struct node * lchild; struct node * rchild;}node;void Init(node *t){ t = NULL;}node * Insert(node *t , int key 阅读全文