这里给出基本思想和实现代码 .
优先队列 :
曾经做过的一道例题 坦克大战
1 struct node 2 { 3 int x,y,step; 4 friend bool operator <(node s1,node s2) // 定义结构体 的时候 这个 就是 用于 优先队列的 基准排序 5 { 6 return s1.step>s2.step; // 步数小的 在上 为小顶堆 7 } 8 }; 9 priority_queue<node>Q; // 优先队列的结构体定义说明和 生命方法
并查集 :
曾经做过的一道例题 七桥问题
int findx(int x) { if(x!=parent[x]) parent[x]=findx(parent[x]); // 回溯的时候压缩路径 这个是 压缩路径的精髓 return parent[x]; // 实际上我也看不出来 到底哪里好 ...... } son : 1 3 8 9 parent : 1 1 3 8
int find(int x) { int k,j,r; r = x; while(r != parent[r]) // r = parent[r]; k = x; while(k != r) { j = parent[k]; parent[k] = r; k = j; } return r; }
字典树
曾经做过的一道题 http://www.cnblogs.com/A-FM/p/5181956.html
构造一个结构体 , 该结构体 应该有 所有指向下一排所有元素的指针域 , 还应该有 该节点 必要的信息
1 struct node 2 { 3 int number; // 该节点作为 尾节点的次数 4 node next[26]; // 和 剩下的 指针域 5 }; 6 int Insert(char *a,node *t) 7 { 8 node *p,*q; 9 int id,i,j,l; 10 p=t; // 已经开了空间 11 l=strlen(a); 12 for(i=0;i<l;i++) 13 { 14 id=a[i]-‘a‘; 15 if(p->next[id]==NULL) //如果 没有 这个线段的话 16 { 17 q=(node *)malloc(sizeof(node)); 18 q->sum=0; 19 for(j=0;j<26;j++) 20 q->next[j]=NULL; 21 p->next[id]=q; // 建立线段 . 线段 的 另一端 已经设置好了. 22 } 23 p=p->next[id]; 24 } 25 (p->sum)++; 26 return p->sum; 27 }
树状数组 :
时间: 2024-10-12 10:17:01