2011年8月24日

以数组方式建立二叉树

摘要: sicily 1156//结点以0到1000标识,存储在数组tree[1001]中,这样就可以不用按遍历或按层遍历的方法来建立二叉树了,随时都可以插入一结点#include<iostream>#include<stack>#include<memory.h>using namespace std;int isroot[1001];bool had[1001];struct node{ char c; int l;int r;}tree[1001];void init(){ for (int i=0;i<=1000;i++) tree[i].l=tree 阅读全文

posted @ 2011-08-24 21:15 sysu_mjc 阅读(310) 评论(0) 推荐(0)

图的关键路径

摘要: #include <iostream>using namespace std; //边表示活动的网AOE网,是基于假设:活动可以并行地进行,即从某顶点出发的几条边可以同时进行const int MaxVertex=10;const int MaxEdge=50;struct Edge { int index; //邻接顶点的下标,表示第index个顶点 int weight; Edge *next;};struct item //表头结点结构{ int data; //顶点数据 ... 阅读全文

posted @ 2011-08-24 21:12 sysu_mjc 阅读(388) 评论(0) 推荐(0)

森林

摘要: //sicily 1034. Forest// 1.如果有任一节点的入度>1 或者没有根节点,则不是森林,否则:// 2.先找根节点(入度为0的节点),压入栈.// 3.对栈中的根结点(当前)删除掉,把所有子节点压入栈,重复这过程.最后若所有结点都曾压入栈中,则能构成森林,反之则说明有环存在#include<iostream> //BFS求森林深度和宽度 #include<stdio.h>#include<vector>#include<stack>#include<cstring>using namespace std;str 阅读全文

posted @ 2011-08-24 16:32 sysu_mjc 阅读(274) 评论(0) 推荐(0)

邻接链表

摘要: //sicily 1024. Magic Island#include<iostream>#include<cstring>using namespace std;struct Edge{ int v,w; int next;}edge[20010];int head[10010],curr,vis[10010],res;void add_edge(int x,int y,int d) //读入的边插入到图的邻接链表{ edge[curr].v=y;edge[curr].w=d; edge[curr].next=head[x]; head[x]=curr; ... 阅读全文

posted @ 2011-08-24 16:31 sysu_mjc 阅读(696) 评论(0) 推荐(0)

哈夫曼树

摘要: #include <iostream>#include <iomanip>#include <string>using namespace std;typedef int ElementType;struct HuffNode { ElementType data; //data表示权值数据域 int par; //par=0表明结点是独立的,par>0为它的双亲下标 int lch,rch; //lch,rch左右孩子结点在数组中的下标,0,0则表示它是独立结点};const int MAXSIZE... 阅读全文

posted @ 2011-08-24 16:28 sysu_mjc 阅读(297) 评论(0) 推荐(0)

二叉树之三

摘要: #include<iostream> #include<stack>#include <queue>using namespace std;struct BiNode{ char data; BiNode *LChild; BiNode *RChild; int ltag;int rtag;};void Creat(BiNode *root) //先序建立{ char ch; cin>>ch; if(ch=='#'){root->data=ch;root->ltag=root->rtag=0;} //#代表... 阅读全文

posted @ 2011-08-24 16:27 sysu_mjc 阅读(177) 评论(0) 推荐(0)

二叉树之二

摘要: //sicily 1156. Binary tree#include<iostream> //给出一棵二叉树,输出前序遍历序列#include<stack>using namespace std;struct node{ char c; int l,r;}tree[1010];int vis[1010],rt[1010];void add(int p,char c,int l,int r) //满足vis[p]==1且rt[p]==1 是根结点{ tree[p].c=c; vis[p]=1; if(l>0) { tr... 阅读全文

posted @ 2011-08-24 16:26 sysu_mjc 阅读(177) 评论(0) 推荐(0)

二叉树之一

摘要: //sicily 1935. 二叉树重建#include <iostream> //根据先序遍历序列和中序遍历序列建立二叉树,并按层遍历#include <string>using namespace std;string str1,str2;int n;struct Node { char ch; Node *left,*right;}node[5000];Node* built(int s1,int t1,int s2,int t2) //根据先序遍历序列和中序遍历序列建二叉树{ int m=n++; //声明为局部变量 n... 阅读全文

posted @ 2011-08-24 16:25 sysu_mjc 阅读(136) 评论(0) 推荐(0)

二叉排序树

摘要: #include <iostream>using namespace std;typedef int ElementType;struct BstNode { ElementType data; BstNode *lch; BstNode *rch;};class BstTree{public: BstNode *root;public: BstTree(){root=NULL;} void creat(); void NorecCreat(); //非递归创建二叉排序树 void inorder(){inorder(root);} v... 阅读全文

posted @ 2011-08-24 16:24 sysu_mjc 阅读(185) 评论(0) 推荐(0)

差分约束系统

摘要: //差分约束系统//定理:给定一差分约束系统Ax≤b,设G=(V,E)为其相应的约束图。//如果G不包含负权回路,即权值之和小于0 的环路。//那么x=( d(v0,v1) , d(v0,v2) , … , d(v0,vn) )是此系统的一可行解,//其中d(v0,vi)是约束图中v0到vi的最短路径(i=1,2,…,n)。//如果G包含负权回路,那么此系统不存在可行解。//所以可以用Bellman-Ford算法解决差分约束系统。//求解差分约束系统,可以转化成图论的单源最短路径问题。//观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w[u,v]// 阅读全文

posted @ 2011-08-24 16:22 sysu_mjc 阅读(217) 评论(0) 推荐(0)

trie树

摘要: // poj4 3630 Phone List// 题意: 给一组互不相同的号码,问其中是否有号码是另一号码的前缀#include <iostream> // trie树using namespace std ;struct Node { Node *next[10]; //数字0-9 int vis; //记录该节点所代表的号码是否有被访问过}table[100000];Node *root;int cur;void init(){ //trie树的根结点不包含字符信息 root=&table[0]; f... 阅读全文

posted @ 2011-08-24 16:20 sysu_mjc 阅读(155) 评论(0) 推荐(0)

STL堆之四

摘要: #include<iostream> //自定义比较函数#include<algorithm>#include<cstring>#include<stdio.h>using namespace std;#define maxn 100010struct node{ char name[11]; int mark;}heap[2][maxn]; //heap[0],heap[1]分别表示大顶堆和小顶堆bool myless(const node& a,const node& b) //大顶堆比较函数{ r... 阅读全文

posted @ 2011-08-24 16:15 sysu_mjc 阅读(177) 评论(0) 推荐(0)

STL堆之五

摘要: //有一些随时更新的数据,求排序后在中间的那个数据//可以把数据分成两半,使用两个堆,最大堆和最小堆,一半比中间值小,一半比中间值大,//插入数据时,只需要和前一半(最大堆)的最大值和后一半(最小堆)的最小值比较即可//必须保证第1个堆(大顶堆)的堆顶结点要小于第2个堆(小顶堆)的堆顶结点,//这样小顶堆的结点就全部大于大顶堆的结点,且小顶堆的结点数只能与大顶堆的结点数相等或者比它大 1 //这样任何时候,如果两堆大小相等,则说明是偶数,不存在中间结点//如果小顶堆的结点个数大于大顶堆(>1),则中间结点就是小顶堆的堆顶结点#include<iostream> //sicil 阅读全文

posted @ 2011-08-24 16:15 sysu_mjc 阅读(244) 评论(0) 推荐(0)

STL堆之二

摘要: #include <iostream>#include <algorithm>#include <vector>#include<functional>using namespace std;int main () { int myints[] = {10,20,30,5,15}; vector<int> v(myints,myints+sizeof(myints)/sizeof(myints[0])); vector<int>::iterator ite; //heap各种操作的效果是对参数指向的vector容器里储存的 阅读全文

posted @ 2011-08-24 16:14 sysu_mjc 阅读(341) 评论(0) 推荐(0)

STL堆之三

摘要: //如果一开始用greater,则之后调用的push_heap,pop_heap,sort_heap都要带greater,否则出现异常:invalid heap#include<iostream>#include<algorithm>#include<vector>#include<functional>using namespace std;void print_ivec(vector<int>::iterator begin, vector<int>::iterator end){ for(;begin != end; 阅读全文

posted @ 2011-08-24 16:14 sysu_mjc 阅读(147) 评论(0) 推荐(0)

SPFA算法之四

摘要: //poj 3013 Big Christmas Tree#include<iostream> //邻接链表实现单源最短路SPFA #include<deque>using namespace std;#define maxn 50002const __int64 inf=(__int64)1<<63-1; //inf=4611686018427387904 //(1)#define inf (1<<63)-1 (2)const __int64 inf=(__int64)(1<<63)-1; (3)const __int64 inf= 阅读全文

posted @ 2011-08-24 16:11 sysu_mjc 阅读(165) 评论(0) 推荐(0)

SPFA算法之三

摘要: //poj 3013 Big Christmas Tree#include<iostream> #include<deque>using namespace std;#define maxn 50002const __int64 inf=(__int64)1<<63-1; struct Edge { int v; int weight; int next;}Vertex[4*maxn]; int head[maxn],curr;int cases,v,e,i,j,edge[maxn][3... 阅读全文

posted @ 2011-08-24 16:10 sysu_mjc 阅读(190) 评论(0) 推荐(0)

SPFA算法之二

摘要: //当题目中并没有明确的唯一源点,就需要添加超级源点,它到各顶点都可达,//因为如果图是非连通的,那么有些顶点将一直得不到检查,//解决方法就是在初始队列时,把所有的顶点都压入队列里#include <iostream> //poj 2983 差分约束系统,使用并查集#include <queue>using namespace std;const int MAX = 500000;const int INF = 1000000000;const int N = 2000;struct Node{ int v; int cost; int next;};Node... 阅读全文

posted @ 2011-08-24 16:08 sysu_mjc 阅读(174) 评论(0) 推荐(0)

SPFA算法之一

摘要: //poj 1511 Invitation Cardstle//有p个点和e条边,从第一个点出发,求到每个点再回来所需要的最短路之和。边是有向边。//1 <= p,e<= 1000000 显然邻接矩阵是不可能存下来的,所以用邻接表//先正向建边求一次最短路径(从顶点1到其他顶点),再反向建边再求一次最短路径,两次求和#include<iostream> using namespace std;struct Edge { int index; int weight; Edge *next;}Vertex[1000002]; ... 阅读全文

posted @ 2011-08-24 16:07 sysu_mjc 阅读(238) 评论(0) 推荐(0)

RMQ区间最值

摘要: //poj 3264 #include <iostream> //线段树,求区间的最值问题using namespace std;struct segment{ int max,min;}table[200000]; //4*50000int arr[50005],MAX,MIN;void built_tree(int s,int t,int n){ if(s==t) table[n].max=table[n].min=arr[s]; else { int mid=(s+t)/2; built... 阅读全文

posted @ 2011-08-24 16:03 sysu_mjc 阅读(198) 评论(0) 推荐(0)

RMQ的ST算法

摘要: //poj 3264 Balanced Lineup#include<iostream> //ST算法,即(Sparse_Table ,稀疏表),可以在O(nlogn)的预处理以后,实现O(1)的查询效率#include <cmath>using namespace std;const int max_n=50005;int arr[max_n],n,t,l,r; //原数列arr从下标1开始int rmq_m[max_n][16],rmq_n[max_n][16]; //16>=log2(50000)//rmq_m[i][j],rmq_n[i][j]... 阅读全文

posted @ 2011-08-24 16:02 sysu_mjc 阅读(345) 评论(0) 推荐(1)

Floyd 算法

摘要: #include <iostream> //每对顶点之间的最短路径,弗洛伊德(Floyd)算法using namespace std; const int MaxWeight=100000; int Vertex,edge[1000][1000],distF[1000][1000],i,j;void init(){ for(i=1;i<=Vertex;i++) //结点坐标都是从1开始的 for(j=1;j<=Vertex;j++) { if(... 阅读全文

posted @ 2011-08-24 16:01 sysu_mjc 阅读(182) 评论(0) 推荐(0)

迭代加深搜索

摘要: Search Techniques搜索方式译 by Lucky Crazy样例:n皇后问题 [经典问题]将n个皇后摆放在一个n x n的棋盘上,使得每一个皇后都无法攻击到其他皇后。深度优先搜索 (DFS)显而易见,最直接的方法就是把皇后一个一个地摆放在棋盘上的合法位置上,枚举所有可能寻找可行解。可以发现在棋盘上的每一行(或列)都存在且仅存在一个皇后,所以,在递归的每一步中,只需要在当前行(或列)中寻找合法格,选择其中一个格摆放一个皇后。1search(col)2iffilledallcolumns3printsolutionandexit4foreachrow5ifboard(row,col) 阅读全文

posted @ 2011-08-24 08:18 sysu_mjc 阅读(1396) 评论(0) 推荐(1)

导航