`
kenby
  • 浏览: 724747 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

poj 1459 push-relabel算法求最大流

阅读更多

 

#include <stdio.h>
#include <string.h>

#define DEBUG

#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__) 
#else
#define debug(...)
#endif

#define N 102
#define MAX_INT 2000000

#define min(a, b) ((a) < (b) ? (a) : (b))

int		graph[N][N];
int		h[N];
int		e[N];
int		n;

int push_relabel(int s, int t)
{
	int 	max_flow, u, v, d, done, relabel, min_height;

	memset(h, 0, sizeof(h));
	memset(e, 0, sizeof(e));

	h[s] = n;
	for (u = 1; u <= t; u++) {
		if (graph[s][u] > 0) {
			e[u] = graph[s][u];
			e[s] -= graph[s][u];
			graph[u][s] = graph[s][u];
			graph[s][u] = 0;
		}
	}

	for (;;) {
		done = 1;
		for (u = s+1; u < t; u++) {
			if (e[u] > 0) {
				done = 0;
				//先假设顶点u需要relabel
				relabel = 1;
				for (v = s; v <= t && e[u] > 0; v++) {	/* 检查能push的顶点 */
					if (graph[u][v] > 0 && h[u] > h[v]) {
						//push
						relabel = 0;
						d = min(graph[u][v], e[u]);
						e[u] -= d;
						e[v] += d;
						graph[u][v] -= d;
						graph[v][u] += d;
						debug("push %d --%d--> %d, e[%d] = %d\n", u, d, u, u, e[u]);
					}
				}
				//没有可以push的顶点,执行relabel
				if (relabel) {
					//relabel
					min_height = MAX_INT;
					for (v = s; v <= t; v++) {
						if (graph[u][v] > 0 && h[v] < min_height) {
							min_height = h[v];
						}
					}
					h[u] = 1 + min_height;
					debug("relabel %d height to %d\n", u, h[u]);
				}
			}
		}
		if (done) {	/* 除源点和汇点外,每个顶点的e[i]都为0 */
			max_flow = 0;
			for (u = s; u <= t; u++) {
				if (graph[t][u] > 0) {
					max_flow += graph[t][u];
				}
			}
			break;
		}
	}
	return max_flow;
}

int main()
{
	int		np, nc, m, u, v, w;

	while (scanf("%d", &n) != EOF) {
		n += 2;		/* 添加源点和汇点 */
		scanf("%d %d %d", &np, &nc, &m);
		memset(graph, 0, sizeof(graph));
		//输入m条边
		while (m--) {
			scanf(" (%d,%d)%d", &u, &v, &w);
			graph[u+1][v+1] = w;
		}
		//输入np个power station
		while (np--) {
			scanf(" (%d)%d", &u, &w);
			graph[0][u+1] = w;
		}
		//输入nc个consumer
		while (nc--) {
			scanf(" (%d)%d", &u, &w);
			graph[u+1][n-1] = w;
		}
		printf("%d\n", push_relabel(0, n-1));
	}
	return 0;
}
分享到:
评论

相关推荐

    POJ3308-Paratroopers 【Dinic算法求最大流】

    【二分图顶点覆盖-&gt;最小割-&gt;最大流-&gt;Dinic算法求解】 解题报告+AC代码 http://hi.csdn.net/!s/WKVPR0 ----&gt; 我的所有POJ解题报告 http://blog.csdn.net/lyy289065406/article/details/6642573

    POJ1459-Power Network

    【标签】"POJ 1459 Power Network"表明这是一个关于POJ平台的特定编号题目,涉及的是电力网络相关的问题,可能需要理解图的理论知识和实际应用算法。 【压缩包子文件的文件名称列表】: - "POJ1459-Power Network...

    北大POJ初级-基本算法

    【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...

    北大POJ初级-图算法

    【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...

    POJ3211--Washing Clothes

    【标题】"POJ3211--Washing Clothes" 是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这类题目通常要求参赛者编写程序来解决特定问题,以此锻炼和测试他们的编程技能和算法理解能力...

    POJ水题集--50道--增加自信

    POJ水题集-----50道左右-----增加自信啊..

    POJ3259--Wormholes(bellman).rar_wormhole code _wormholes

    标题中的“POJ3259--Wormholes(bellman)”是指一个编程竞赛问题,源自POJ(Programming Online Judge)平台。这个问题涉及到利用贝尔曼-福特算法(Bellman-Ford Algorithm)解决“虫洞”(Wormholes)的问题。在...

    poj1038--Bugs.rar_Bugs_poj 1038 _poj10_poj1038

    POJ(Problemset Online Judge)是一个在线编程竞赛平台,它提供了一系列的问题供参赛者解决,旨在锻炼和提升编程能力,特别是算法设计与实现的能力。编号为1038的题目被称为“Bugs”,这可能是一个关于程序错误或...

    POJ2195-Going Home【费用流】

    【标题】"POJ2195-Going Home" 是一道来自北京大学在线判题系统POJ的编程题目,主要考察的是运用费用流算法解决实际问题的能力。这道题的中文名称是“回家”,通过题目我们可以推测它可能涉及到路径规划或者资源分配...

    Stoer-Wagner算法求全局最小割(模板)

    Stoer-Wagner 算法求全局最小割模板 Stoer-Wagner 算法是一种用于计算图的全局最小割的算法,该算法由 Daniel Stoer 和 Frank Wagner 于 1994 年提出。该算法可以应用于计算网络的最小割,例如计算社交网络中两个...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    北大POJ中级-基本算法

    【北大POJ中级-基本算法】解题报告与AC代码详解 北京大学的在线编程平台POJ(Problem Set of Peking University)是许多编程爱好者和学习者提升算法技能的重要平台。中级算法题目通常涵盖了一些基础但重要的算法...

    acm 分类 北大

    - 最大流:KM算法,如POJ1459。 3. **数据结构** - 串:处理字符串问题,如POJ1035。 - 排序:快速排序、归并排序和堆排序,如POJ2299。 - 并查集:处理不相交集合问题,如POJ3349。 - 哈希表和二分查找:提高...

    POJ1390--blocks.rar

    POJ是一个在线的编程竞赛平台,程序员可以在这里提交自己的源代码来解决特定的算法问题。在这个案例中,问题编号为1390,通常每个问题都有其独特的描述和要求,而“blocks”可能是该问题的题目或者与题目内容相关的...

    POJ1038--Bugs Integrated

    【标题】"POJ1038--Bugs Integrated" 是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这类题目通常要求参赛者编写程序来解决特定问题,以此锻炼和测试他们的算法设计和编程能力。在...

    POJ3036--Honeycomb Walk

    【标题】"POJ3036--Honeycomb Walk" 是一个编程竞赛中的问题,源自著名的在线编程平台POJ(Problem Set)。该题目要求参赛者解决一个与蜂巢行走相关的数学问题,涉及到动态规划和组合优化的概念。 【描述】在...

    POJ---1456.Supermarket测试数据及答案

    POJ---1456.Supermarket测试数据及答案,题目描述:A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral ...

    POJ1258-Agri-Net【Prim】

    解题的关键在于正确实现Prim算法,并确保其运行效率足够高,以满足POJ系统的时限要求。通常可以采用优先队列(如二叉堆)来优化查找最小边的过程,以降低时间复杂度。 **AC代码分析:** 解题报告中的"POJ1258-Agri-...

    POJ3414-Pots

    标题“POJ3414-Pots”是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要考察的是算法设计和实现能力,通常涉及计算机科学中的数据结构和算法知识。 解题报告是参赛者在...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

Global site tag (gtag.js) - Google Analytics