- 浏览: 388588 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- java编程 (4)
- java实用程序 (2)
- 算法设计 (34)
- 数据库 (8)
- ACM模板 (12)
- 技术术语 (1)
- java_web (3)
- php (22)
- eclipse (3)
- linux (25)
- linux命令使用心得 (3)
- web服务器 (8)
- IT知识 (2)
- 前端技术 (17)
- 开源软件 (5)
- vim (3)
- linux多线程 (9)
- web开发经验 (3)
- lua (5)
- linux编程 (3)
- smarty (1)
- mysql (4)
- Hive (2)
- 数据挖掘 (9)
- python (2)
- 生活 (1)
- C++ (2)
- 计算机 (1)
- objective-c (11)
- css (2)
- 游戏 (1)
- Mac (1)
最新评论
-
lr544463316:
我的怎么不行呀.....
Mysql Access denied for user ''@'localhost' to database 的一种解决方法 -
babaoqi:
使用时需要注意group_concat函数返回值的最大长度=g ...
mysql中的group_concat函数 -
代码能力弱成渣:
可以帮我看下我的代码么?我自己写的sam,也有ac过题的,但是 ...
求两个字符串的最长公共连续子序列(SAM实现) -
atgoingguoat:
有1000个?不过还是收藏下。
jquery常用的插件1000收集(转载)
/* 树基于边的分治算法,计算树中距离小于等于k的点对数目 点的下标从1开始,树里实际的节点个数的上界是N*3 当点只有一个的时候,得到的是空树(这个需要注意), 分治树有O(log(NUM))层,如果会动态改变树里的信息的话, 还需要记录每个的节点在每一层是在左子树还是右子树,以及在这一层 到根的距离信息(这里的根指的是这一层的分治边的两个点中到该点距离 较近的那个点)。 树重构后[1,n]为原树中的 节点,[n+1,cnt]为虚拟节点 */ #include <cstdio> #include <algorithm> #include <cmath> #include <ctime> using namespace std; const int N = 10005; const int NUM=N*3; //重构后树中的节点的个数最大值 typedef int wtype; //边权的类型 const wtype INF = 0X7FFFFFFF; struct e{ int u, v; wtype len; e *nxt, *pair; bool used; //标记一条边是否已经被选过了 //分治树的数据结构 e *ls, *rs; }*fir[NUM], es[(NUM+N)*2]; int n, en, cnt, k; //cnt为重构后的树中的节点 int que[NUM], par[NUM], size[NUM]; e* eque[NUM]; wtype len[NUM]; wtype lens[2][NUM]; int nums[2], ans; void clear(int n){ en = 0; int i; for(i = 1; i <= n; i++){ fir[i] = NULL; } } void add_e(int u, int v, e* pair, wtype len){ es[en].u = u; es[en].v = v; es[en].pair = pair; es[en].len = len; es[en].used = false; es[en].nxt = fir[u]; fir[u] = &es[en++]; } void insert(int u, int v, wtype len){ add_e(u, v, &es[en+1], len); add_e(v, u, &es[en-1], len); } void adjust(int l, int r, int f, int& cnt){ if(r-l <= 1){ while(l <= r){ int u = que[l]; par[u] = f; insert(u, f, eque[l++]->len); } }else{ int mid = (l+r)>>1, ls, rs; fir[ls=++cnt] = NULL; insert(ls, f, 0); fir[rs=++cnt] = NULL; insert(rs, f, 0); par[ls]=par[rs]=f; adjust(l, mid, ls, cnt); adjust(mid+1, r, rs, cnt); } } void adjust(int n){ //重构树 int l, r, u, v, mid; e* cur; cnt = n; for(l=r=0, par[1]=-1, que[r++]=1; l!=r; ){ for(cur = fir[u=que[l++]], mid=r; cur; cur = cur->nxt){ if(!cur->used && (v=cur->v) != par[u]){ que[r] = v; par[v] = u; eque[r++] = cur; } } if(r-mid > 2){ adjust(mid, r-1, u, cnt); //删边,只需把那些边的used标记为true即可 while(mid<r){ eque[mid]->used=true; eque[mid++]->pair->used=true; } } } } inline int ABS(int a){ return a>0 ? a:-a; } e* getRoot(int s, bool isLeft){ //找根节点 e *ans=NULL, *cur; int l, r, u, num, v, ds, i; nums[isLeft]=0; for(l=r=0, par[s]=-1, len[s]=0, que[r++]=s; l!=r; ){ for(cur=fir[u=que[l++]]; cur; cur=cur->nxt){ if(!cur->used && (v=cur->v) != par[u]){ eque[r]=cur; que[r++]=v; par[v]=u; len[v]=len[u]+cur->len; } } } for(i=r-1; i>=0; i--){ if(que[i] <= n){ lens[isLeft][nums[isLeft]++]=len[que[i]]; } } for(num=r, i=r-1; i>=1; i--){//队列里的第一个点不可能被选择 u=que[i]; size[u]=1; for(cur=fir[u]; cur; cur=cur->nxt){ if(!cur->used && (v=cur->v) != par[u]){ size[u] += size[v]; } } if(ans==NULL || ds > ABS(num-size[u]*2)){ ans=eque[i]; ds=ABS(num-size[u]*2); } } return ans; } void division(e*& r, int d){ if(!r) return ; //r->u作为左孩子,r->v作为右孩子 r->used = true; r->pair->used = true; r->ls = getRoot(r->u, true); r->rs = getRoot(r->v, false); int il, ir; //计算点对 sort(lens[0], lens[0]+nums[0]); sort(lens[1], lens[1]+nums[1]); for(il=0, ir=nums[0]-1; il<nums[1]; il++){ while(ir >= 0 && lens[1][il]+lens[0][ir]+r->len>k) ir--; ans += ir+1; } division(r->ls, d+1); division(r->rs, d+1); } //r为根节点(初始为空,s为一个起点,n为点的个数) void build(e*& r, int s, int n){ //构建分治树 adjust(n); //首先得调整树的结构 r = getRoot(s, false); division(r, 1); } //输入一个整数 template<typename T> void getSNum(T& ans){ char ch; int s; while(true){ ch = getchar(); if((ch >= '0' && ch <= '9') || ch == '-') break; } if(ch == '-'){ s = -1; ans = 0; }else{ s = 1; ans = ch -'0'; } while(true){ ch = getchar(); if(!(ch >= '0' && ch <= '9')) break; ans = ans*10+ch-'0'; } ans *= s; } bool input(){ scanf("%d%d", &n, &k); if(n == 0 && k == 0) return false; int u, v, i; wtype len; clear(n); for(i = 1; i < n; i++){ getSNum(u); getSNum(v); getSNum(len); insert(u, v, len); } return true; } void solve(){ e* root=NULL; ans=0; if(n > 1){ build(root, 1, n); } printf("%d\n", ans); } int main(){ //freopen("in.txt", "r", stdin); while(input()) solve(); return 0; }
发表评论
-
升序数组中求一个key出现的次数
2013-01-09 23:08 1107算法思路: 在排好序的数组,相同的数字是排列在一起的,所以只需 ... -
判断单链表是否有环
2013-01-08 19:07 919算法思路: 指针p1和p2的起始值均为链表的表头,指针p1每次 ... -
hdu3684
2011-11-15 20:11 930/* 刚开始打了个记录上下左右四个点的,一直tle。 ... -
hdu3686
2011-11-14 20:43 1035/* 无向图边的双连通分量,在同一个连通分量里的边之间 ... -
poj3968
2011-11-14 04:45 1414source: http://poj.org/problem ... -
uva2819
2011-11-13 02:20 900source: http://livearchive.onli ... -
manacher算法
2011-11-11 00:06 2433const int LEN=110005; const ... -
hdu4118
2011-11-09 21:53 1192枚举每条边最多被经过的次数即可 #include ... -
hdu4115
2011-11-09 16:27 1039source: http://acm.hdu.edu.cn/ ... -
uva(Transitive Closure)
2011-11-08 14:45 918source: http://livearchive.onli ... -
zoj3500
2011-11-07 17:41 955求两个球的体积交或者并 #include <cs ... -
zoj3545
2011-11-04 18:18 867/* AC自动机 相当暴力的 解法: mark[i ... -
zoj3190
2011-11-04 17:34 1317/* * AC自动机,先对资源串和病毒串构成的字符串 ... -
zoj3228
2011-11-04 16:12 948/* * AC自动机,每个节点 添加一个d表示节点代 ... -
poj3691(DNA Repair)
2011-11-04 13:18 1480/* AC自动机,增设虚拟节点,求长度为n的字符串中包 ... -
hdu2825
2011-11-04 11:53 991/* AC自动机,增设虚拟节点,求长度为n的字符 ... -
hdu4095
2011-11-03 13:19 1020/* 第一步,构建BST,用第一个数作为bst的 ... -
zoj3540
2011-11-02 21:33 925/* 其实就是把总共的 放置次数减去不能放置的那些就行 ... -
hdu2939
2011-10-29 18:36 859source: http://acm.hdu.edu.cn/s ... -
hdu3982
2011-10-29 10:20 946//半平面交+多边形和圆的交的面积 #include ...
相关推荐
C_(POJ_1854)(分治).cpp
* 哈夫曼树:哈夫曼树是指解决问题的哈夫曼树算法,如 poj3253。 * 堆:堆是指解决问题的堆算法。 * trie 树:trie 树是指解决问题的 trie 树算法,如 poj2513。 四、简单搜索 简单搜索是指解决问题的简单搜索...
* 递归和分治法:通过将问题拆分成小问题来解决,例如 poj3295。 * 递推法:通过逐步解决问题来获得最终解,例如 poj1068、poj2632、poj1573、poj2993、poj2996。 * 构造法:通过构造解来解决问题,例如 poj3295...
Prim算法和Kruskal算法分别基于贪心策略和并查集数据结构,用于在带权图中找到连接所有顶点的最小总权重的树结构。 #### 拓扑排序 适用于有向无环图,帮助分析任务依赖关系,如poj1094所示。 #### 匹配算法 包括...
- 分治法:将一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,如`poj3295`。 - 递推:利用已知的基础条件和递推关系式来求解问题,通常用于解决序列问题。 - 模拟法:按照...
poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...
【标签】"POJ 分类"表明我们将探讨的是基于POJ(Problemset Online Judge)平台上的算法题目分类。 以下是对【部分内容】中提到的知识点的详细说明: 1. **基础算法**: - **枚举**:通过尝试所有可能的情况来...
描述中提到的"递归经典题目"意味着这个题目可能涉及到递归算法,递归是一种函数或过程调用自身的技术,常用于解决分治策略的问题,如树遍历、排序(如快速排序、归并排序)和求解数学问题(如斐波那契数列)等。...
在"POJ1836-Alignment【O(nlogn)】.cpp"文件中,我们可以期待看到一个时间复杂度为O(nlogn)的高效算法实现,这暗示了可能使用了分治或者排序等数据结构和算法技术。 【知识点】: 1. **动态规划**:此题可能涉及到...
- POJ 2182 - Fractal(利用递归和分治思想求解) - POJ 2264 - The Die Is Cast(哈希表应用) **相关知识点**: - 不同数据结构的特点及其应用场景 - 动态数组与静态数组的区别 - 栈和队列在实际问题中的应用案例...
下面将基于给出的分类来详细介绍每一类算法的核心知识点及部分示例题目。 ### 1. 动态规划(Dynamic Programming) 动态规划是一种在计算机科学中被广泛使用的算法思想,主要用于解决具有重叠子问题和最优子结构...
【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...
【标题】"poj acm 题解 算法"所指的是一份针对ACM(国际大学生程序设计竞赛)中POJ(Problemset Online Judge)平台上的题目进行解答的资源集合。ACM竞赛是全球范围内的一项编程竞赛,旨在提升大学生的算法设计和...
2. **数据结构**:链表、数组、栈、队列、树(二叉树、平衡树、堆)、图等。 3. **字符串处理**:KMP算法、Rabin-Karp算法、Manacher's Algorithm等。 4. **数学应用**:模运算、数论、组合数学、图论等。 5. **...
【标题】"POJ2389-Bull Math" 是北京大学在线编程平台POJ上的一道题目,旨在考察参赛者的算法思维与编程能力。这道题目通常会吸引那些热衷于算法竞赛和程序设计的程序员参与,特别是对于C++、Java等编程语言有一定...
【标题】"poj 130题 acm pku" 涉及的是ACM(国际大学生程序设计竞赛)中的PKU(北京大学)在线判题系统POJ(Problem Online Judge)的相关题目。ACM/ICPC(International Collegiate Programming Contest)是全球...
标题“POJ1390--blocks.rar”指的是一个压缩包文件,用于提交给编程竞赛平台POJ(Programming Online Judge)的解决方案。POJ是一个在线的编程竞赛平台,程序员可以在这里提交自己的源代码来解决特定的算法问题。在...
在初期阶段,选手需要掌握基本算法,如枚举、贪心、递归和分治法等。然后,需要学习图算法,如深度优先遍历、广度优先遍历、最短路径算法和最小生成树算法等。最后,需要学习数据结构,如串、排序、堆和哈希表等。 ...
1. **基础数据结构**:在POJ的题目中,数据结构是解决问题的基础,如数组、链表、栈、队列、树(二叉树、平衡查找树等)、图等。理解和熟练运用这些数据结构,能够帮助我们有效地存储和操作数据,为算法的实现打下...
标题“PKU_poj 1001~1009”揭示了这是一组与北京大学(Peking University)编程竞赛平台POJ相关的解决方案。在这个压缩包中,包含了从问题1001到1009的C++源代码,表明这些代码已经过验证并成功解决了对应的算法问题。...