- 浏览: 724750 次
- 性别:
- 来自: 北京
最新评论
-
wxweven:
Surmounting 写道既然 Java 的跳表那么少,我决 ...
SkipList 跳表 -
暮雪云然:
写的不错,很透彻
Java静态内部类 -
bzhao:
好,赞扬!
Linux信号详解 -
jacktao219:
赞一个~! ,现在正在看redis 所以接触到跳表
SkipList 跳表 -
is_leon:
vote--后还要判断是否为0吧,如果为0则废掉重新置位can ...
现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
#include <stdio.h> #include <string.h> #define DEBUG #ifdef DEBUG #define debug(...) printf( __VA_ARGS__) #else #define debug(...) #endif #define N 20010 #define M 1800000 #define MAX_INT 0x3fffffff #define min(a, b) (a) < (b) ? (a) : (b) /* 图的邻接表+静态链表表示法 */ struct Edge{ int u, v, weight; int next; }; struct Edge edge[M]; int head[N]; /* head[u]表示顶点u第一条邻接边的序号, 若head[u] = -1, u没有邻接边 */ int n; int current; /* 当前有多少条边 */ void add_edge(int u, int v, int weight) { /* int i; //检查u->v是否存在 for (i = head[u]; edge[i].v != v && i != -1; i = edge[i].next); if (i != -1) { edge[i].weight = weight; return; }*/ /* 添加正向边u->v */ edge[current].u = u; edge[current].v = v; edge[current].weight = weight; edge[current].next = head[u]; head[u] = current++; /* 添加反向边v->u */ edge[current].u = v; edge[current].v = u; edge[current].weight = 0; edge[current].next = head[v]; head[v] = current++; } int isap(int s, int e) { int i, u, v, max_flow, aug, min_lev; /* 寻找增广路径的过程中, curedge[u]保存的是对于顶点u当前遍历的边, 寻找顶点u的邻接边时不用每次 * 都从head[u]开始找, 而是从curedge[u]开始找, 这样就减少了搜索次数 * 当增广路径找到后 * curedge保存的就是一条增广路径了, 比如 * 0---四-->1---六-->2--七--->3---八--->4 0,1,2,3,4是顶点号, 四六七八是边的序号 * curedge[0] = 四, curedge[1] = 六, ... curedge[3] = 8, curedge[i]即保存找过的轨迹 */ int curedge[N], parent[N], level[N]; /* count[l]表示对于属于层次l的顶点个数, 如果某个层次没有顶点了, * 就出现断层, 意味着没有增广路径了, 这就是gap优化, 可以提前结束寻找过程 * augment[v]表示从源点到顶点v中允许的最大流量, 即这条路线的最小权重 */ int count[N], augment[N]; memset(level, 0, sizeof(level)); memset(count, 0, sizeof(count)); //初始时每个顶点都从第一条边开始找 for (i = 0; i <= n; i++) { curedge[i] = head[i]; } max_flow = 0; augment[s] = MAX_INT; parent[s] = -1; u = s; while (level[s] < n) { /* 不能写成level[s] < MAX_INT */ if (u == e) { /* 找到一条增广路径 */ max_flow += augment[e]; aug = augment[e]; debug("找到一条增广路径, augment = %d\n", aug); debug("%d", e); for (v = parent[e]; v != -1; v = parent[v]) { /* 从后往前遍历路径 */ i = curedge[v]; debug("<--%d", v); edge[i].weight -= aug; edge[i^1].weight += aug; /* 如果i是偶数, i^1 = i+1, 如果i是奇数, i^1 = i-1 */ augment[edge[i].v] -= aug; if (edge[i].weight == 0) u = v; /* u指向增广后最后可达的顶点, 下次就从它继续找 */ } debug("\n"); } /* 从顶点u往下找邻接点 */ for (i = curedge[u]; i != -1; i = edge[i].next) { /* 从curedge[u]开始找, 而不是head[u]从头开始, curedge[u]保存的是上次找过的边 */ v = edge[i].v; if (edge[i].weight > 0 && level[u] == (level[v]+1)) { /* 找到一条边就停止 */ augment[v] = min(augment[u], edge[i].weight); curedge[u] = i; parent[v] = u; u = v; break; } } if (i == -1) { /* 没有邻接点, 回溯到上一个点 */ if (--count[level[u]] == 0) { debug("顶点%d在level %d断层\n", u, level[u]); break; } curedge[u] = head[u]; /* 顶点u的所有边都试过了,没有出路, 更新了u的level后, 又从第一条边开始找 */ //找出level最小的邻接点 min_lev = n; for (i = head[u]; i != -1; i = edge[i].next) { if (edge[i].weight > 0) { min_lev = min(level[edge[i].v], min_lev); } } level[u] = min_lev + 1; count[level[u]]++; debug("顶点%d的level= %d\n", u, level[u]); debug("顶点%d走不通, 回到%d\n", u, edge[curedge[u]].u); if (u != s ) u = parent[u]; /* 回退到上一个顶点 */ } } return max_flow; } int main() { int m, u, v, w, a, b; while (scanf("%d %d", &n, &m) != EOF) { memset(edge, 0, sizeof(edge)); memset(head, -1, sizeof(head)); current = 0; for (u = 1; u <= n; u++) { scanf("%d %d", &a, &b); add_edge(0, u, a); add_edge(u, n+1, b); } while (m--) { scanf("%d %d %d", &u, &v, &w); /* 如果调用函数添加边, 速度明显边慢 */ //add_edge(u, v, w); //add_edge(v, u, w); /* 添加正向边u->v */ edge[current].u = u; edge[current].v = v; edge[current].weight = w; edge[current].next = head[u]; head[u] = current++; /* 添加反向边v->u */ edge[current].u = v; edge[current].v = u; edge[current].weight = w; edge[current].next = head[v]; head[v] = current++; } n += 2; printf("%d\n", isap(0, n-1)); } return 0; }
发表评论
-
Paxos算法
2012-04-18 10:59 2669分布式系统的核心问题是数据一致性,解决一致性有很多算法,而 P ... -
编程之美3.3 计算字符串的相似度
2012-03-13 23:26 33问题描述 定义一套操作方法, 把两个不相同的字符串变得相同, ... -
编程之美3.1 字符串移位包含的问题
2012-03-12 23:26 3333题目 给定两个字符串 s ... -
SkipList 跳表
2011-10-09 01:08 39808为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树, ... -
(转)一致性哈希算法及其在分布式系统中的应用
2011-09-29 19:02 2319原文地址: http://www.cnb ... -
算法导论习题 5.1 -2
2011-09-29 09:23 2010描述random(a, b)过程的一种实现,它只调用rando ... -
现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
2011-05-05 19:43 6240现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n ... -
从海量数据中找中位数(c语言实现)
2011-05-05 12:49 5041题目:5亿个int,从中找出第k大的数 算法:之后补上 ... -
寻找最大的K个数 (C语言实现)
2011-05-04 16:31 5352题目:100亿个整数,求最大的1万个数,并说出算法的时间复杂度 ... -
kmp算法的理解与实现
2011-04-30 21:29 25503KMP算法曾被我戏称为看毛片算法,当时笑喷...... ... -
败者树 多路平衡归并外部排序
2011-04-25 21:52 10690一 外部排序的基本思路 ... -
实现两个整数的除法,不能用除号和乘号
2011-04-22 15:17 3642对于两个整数a和b, 求a/b,可以从1开始枚举结果resul ... -
最大公共子字符串(Longest Common Substring)
2011-04-22 13:33 3413Longest Common Substring和Longes ... -
poj 1458 最长公共子串(Longest Common Subsequence)
2011-04-22 10:45 2575LCS问题: 给定序列 X = <x1,x2,... ... -
归并排序
2011-04-21 21:51 1178#include <stdio.h> #i ... -
快速排序 顺序统计量 数组分割
2011-04-21 19:28 1370#include <stdio.h> #in ... -
位运算集锦
2011-04-21 17:15 2114文中2'k代表2的k次方 1 除以2的k次幂可以用位运 ... -
最长递增子序列
2011-04-21 14:45 1191设L = <a1,a2,...an>是n个不同的实 ... -
poj 2774 后缀数组
2011-03-21 17:28 1793#include <stdio.h> # ... -
poj 2823 线段树
2011-03-17 18:49 1624赤裸裸的线段树,数据量很大,加了IO优化函数。 #in ...
相关推荐
【二分图顶点覆盖->最小割->最大流->Dinic算法求解】 解题报告+AC代码 http://hi.csdn.net/!s/WKVPR0 ----> 我的所有POJ解题报告 http://blog.csdn.net/lyy289065406/article/details/6642573
这题是道神题,神就神在,它既能让你搞懂网络流及其优化,还给了你很大的优化空间。
* 最大流的增广路算法:最大流的增广路算法是指计算图的最大流的算法,如 poj1459、poj3436。 三、数据结构 数据结构是指解决问题的数据结构,包括串、排序、简单并查集、哈希表和二分查找等高效查找法、哈夫曼...
【标题】"poj acm 题解 算法"所指的是一份针对ACM(国际大学生程序设计竞赛)中POJ(Problemset Online Judge)平台上的题目进行解答的资源集合。ACM竞赛是全球范围内的一项编程竞赛,旨在提升大学生的算法设计和...
6. **网络流**:包括Ford-Fulkerson算法和Edmonds-Karp算法,它们用于寻找网络中最大流量,可以解决很多实际问题,如电路设计、运输规划等。 在解题报告中,你可能会看到对问题的分析、算法的选择、时间复杂度的...
POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...
poj2516代码最小费用最大流
"最小费用流的原始对偶 (Primal-Dual) 算法" 该算法是融合了直接 ...13. POJ 3422:该题目是一个在线judge平台上的题目,要求使用 zkw 费用流算法来解决最小费用流问题,该题目是 zkw 费用流算法不擅长的一个例子。
根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...
【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...
POJ各题算法分类和题目推荐.pdf
在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...
综上所述,解决"POJ2195-Going Home"题目的关键在于理解和运用费用流算法,通过分析输入数据,构建合适的有向图模型,然后执行算法求解最小费用最大流。提供的代码文件"POJ2195-Going Home.cpp"和文档"POJ2195-Going...
【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...
在这个实验报告中,poj1087 题目就是一个典型的贪心算法应用实例。 题目描述了一个工厂需要将不同尺寸的产品(1*1 到 6*6)使用6*6的包裹进行包装,目标是最小化所需的包裹数量。贪心策略在此问题中的应用是逐个...
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...
标题中的“POJ 1078 算法”指的是北京大学在线判题系统(Problem Online Judge,简称POJ)中的第1077题,这通常是一个编程竞赛或者算法练习题目。POJ是一个供程序员练习算法、提交代码并获取运行结果的平台,主要...
根据提供的信息,我们可以将POJ(Peking Online Judge)平台上的算法题目按照不同的类别进行整理与解析。这对于希望系统性地提高自己算法能力的学习者来说非常有用。下面将基于给出的分类来详细介绍每一类算法的核心...
3. **网络流**:Max-flow算法,用于解决最大流问题(poj1094)。 4. **拓扑排序**:解决有向无环图的排序问题(poj3041, poj3020)。 5. **匹配算法**:如KM算法,用于解决二分图的最大匹配问题(poj1459, poj3436)...
【北大POJ中级-基本算法】解题报告与AC代码详解 北京大学的在线编程平台POJ(Problem Set of Peking University)是许多编程爱好者和学习者提升算法技能的重要平台。中级算法题目通常涵盖了一些基础但重要的算法...