poj 3469 Dual Core CPU

本文介绍了一道关于双核CPU任务分配的问题,通过建立适当的图模型,并运用最大流算法找到最优的任务分配方案,以最小化总执行时间和额外成本。

一 原题

Dual Core CPU
Time Limit: 15000MS Memory Limit: 131072K
Total Submissions: 25359 Accepted: 10962
Case Time Limit: 5000MS

Description

As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Corporation, decided to update their famous product - SWODNIW.

The routine consists of N modules, and each of them should run in a certain core. The costs for all the routines to execute on two cores has been estimated. Let's define them as Ai and Bi. Meanwhile, M pairs of modules need to do some data-exchange. If they are running on the same core, then the cost of this action can be ignored. Otherwise, some extra cost are needed. You should arrange wisely to minimize the total cost.

Input

There are two integers in the first line of input data, N and M (1 ≤ N ≤ 20000, 1 ≤ M ≤ 200000) .
The next N lines, each contains two integer, Ai and Bi.
In the following M lines, each contains three integers: abw. The meaning is that if module a and module b don't execute on the same core, you should pay extra w dollars for the data-exchange between them.

Output

Output only one integer, the minimum total cost.

Sample Input

3 1
1 10
2 10
10 3
2 3 1000

Sample Output

13

Source



二 分析

题意:给定n个任务和2个CPU,每个任务在两个CPU上执行分别需要ai, bi的时间,同时有一些任务最好在同一个CPU上完成,如果分开了,就会产生额外的时间。求最少需要多少时间完成所有任务。

并不难想到,一组任务分配的时间代价等价于一个图的割,于是可以用最大流算法解决这题。建图不复杂,但这题还是很容易TLE的,下面是我多路增广的Dinic算法实现。所谓多路增广就是在Dinic算法中dfs找最短增广路径时,一次性把所有当前长度的路径全部增广。详见代码。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn = 2e4 + 10;
const int maxm = 2e6 + 10;
const int inf = 0x7fffffff;

int n, m, s, t;
vector<int> g[maxn];

struct Edge {
	int src, dst, val;
	Edge() {}
	Edge(int s, int d, int v) : src(s), dst(d), val(v) {}
}edges[maxm];
int eid;

int hd, tl, q[maxn], dep[maxn];

void addEdge(int s, int d, int v, bool flag) {
	edges[eid++] = Edge(s, d, v);
	if(flag)
		edges[eid++] = Edge(d, s, v);
	else
		edges[eid++] = Edge(d, s, 0);
	g[s].push_back(eid - 2);
	g[d].push_back(eid - 1);
}

bool bfs() {
	for(int i = 0; i < maxn; i++) dep[i] = 0;
	hd = tl = 0;
	q[tl++] = s;
	dep[s] = 1;
	while(hd != tl) {
		int x = q[hd++];
		if(x == t) return true;
		for(int i = 0; i < g[x].size(); i++) {
			Edge e = edges[g[x][i]];
			if(e.val <= 0 || dep[e.dst] != 0) continue;
			dep[e.dst] = dep[x] + 1;
			q[tl++] = e.dst;
		}
	}
	return false;
}

int dfs(int cur, int flow) {
	if(cur == t) return flow;
	int ret = 0;
	for(int i = 0; i < g[cur].size(); i++) {
		Edge e = edges[g[cur][i]];
		if(dep[e.dst] != dep[cur] + 1 || e.val <= 0) continue;
		int delta = dfs(e.dst, min(flow, e.val));
		if(delta > 0) {
			edges[g[cur][i]].val -= delta;
			edges[g[cur][i] ^ 1].val += delta;
			ret += delta;
			flow -= delta;
			if(flow <= 0) break;
		}
	}
	return ret;
}

int dinic() {
	int ret = 0, delta;
	while(bfs())
		ret += dfs(s, inf);
	return ret;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	while(cin >> n >> m) {
		s = 0; t = n + 1; eid = 0;
		for(int i = 0; i < maxn; i++) g[i].clear();
		int a, b, c;
		for(int i = 1; i <= n; i++) {
			cin >> a >> b;
			addEdge(s, i, a, false);
			addEdge(i, t, b, false);
		}
		for(int i = 0; i < m; i++) {
			cin >> a >> b >> c;
			addEdge(a, b, c, true);
		}
		cout << dinic() << endl;
	}
	return 0;
}



源码链接: https://pan.quark.cn/s/a4b39357ea24 在本研究中,我们将详细研究如何借助Python执行数据可视化,旨在剖析2018年期间中国四个主要城市——北京、上海、广州以及深圳的空气质量状况。通过绘制反映空气质量指数(AQI)与细颗粒物(PM2.5)变化趋势的图表,我们能够深入理解这些大都市全年的空气环境质量,并明确评估其优良天气所占的比重。 我们必须首先进行数据准备工作。在当前提供的压缩文件内,名为"2018天气"的文件极有可能是数据来源,其中可能收录了涉及四个城市每日空气质量监测的详细信息。这些数据通常涵盖日期、城市名称、AQI数值、PM2.5含量等核心参数。在Python编程环境中,我们惯常运用pandas库来对这类结构化数据进行高效的处理和分析。 1. **数据导入与初步处理**: - 利用`pandas.read_csv()`方法来导入存储为CSV格式的数据资料。 - 数据整理:对数据中的空白项、非正常数值进行修正,保证数据的精确性。 - 调整日期字段的格式,确保其能够适用于时间序列分析的需求。 2. **数据深度分析**: - 针对每个城市的AQI和PM2.5数据执行统计性描述,例如计算平均值、中位数、标准偏差等指标。 - 确定空气质量良好天气的天数,即那些AQI值低于75(依据中国的空气质量评估标准)的日数。 3. **数据呈现**: - 运用matplotlib或seaborn工具绘制折线图,直观展示四个城市在2018年全年的AQI和PM2.5变化动态。 - 可通过采用不同的颜色方案和线条类型来区分不同城市的数据系列。 - 添加必要的图示元素,如日期坐标轴、城市名称标注、图表标题及图例说明,以提升图表的可读...
内容概要:本文围绕“超额消纳量机制下独立售电商购售电策略”展开研究,结合Python代码实现,深入探讨在新型电力系统背景下,独立售电商如何在满足可再生能源超额消纳考核要求的前提下,科学制定购电与售电的联合优化策略。研究内容涵盖电力市场交易规则、可再生能源消纳责任权重机制、成本收益建模、多约束条件下的优化求解方法,并通过Python编程实现相应的数学模型与算法,旨在帮助售电企业在复杂的政策与市场环境中实现经济效益最大化与合规运营。该研究不仅具有理论深度,也具备较强的实践指导价值,可为电力市场化改革下的售电主体提供决策支持。; 适合人群:具备一定电力系统基础知识、电力市场概念理解能力以及Python编程基础的科研人员、高校研究生,以及从事电力市场运营、售电公司策略分析、能源咨询等相关工作的技术人员。; 使用场景及目标:①研究国家及地方可再生能源超额消纳政策对独立售电商经营模式的影响;②构建考虑购电成本、售电收入、偏差考核、绿证交易等多因素的售电企业优化决策模型;③利用Python实现模型求解,进行仿真分析,为售电商制定分时购电计划、零售套餐设计及风险管理策略提供量化依据。; 阅读建议:建议读者在阅读前补充了解中国电力现货市场、中长期交易及可再生能源消纳责任权重相关政策背景,重点关注文中模型的构建逻辑与约束条件设定,动手复现并调试Python代码,尝试调整参数或引入新的约束条件以拓展模型应用范围,从而深入掌握售电侧优化决策的核心方法论。
内容概要:本文提出一种基于灰狼优化算法(GWO)优化改进互补集合经验模态分解(CEEMDAN)的混合储能风电功率平抑策略,旨在提升风电功率波动的抑制效果。通过GWO算法对CEEMDAN的关键参数进行智能寻优,显著提高了信号分解的准确性与自适应性,有效克服模态混叠问题。在此基础上,结合混合储能系统(如锂电池与超级电容)的动态功率分配机制,依据各储能元件的功率-能量特性进行高频与低频功率分量的合理匹配,充分发挥不同储能介质的优势,实现风电输出功率的精细化平抑。研究构建了完整的Matlab仿真模型,验证了该混合策略在降低功率波动、减少储能系统损耗、延长设备寿命及提升风电并网电能质量方面的优越性能。; 适合人群:具备电力系统、新能源发电、信号处理或智能优化算法相关背景,熟悉Matlab编程工具,从事风电并网控制、储能系统设计、电能质量治理或智能算法应用研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解风电功率波动特性及其对电网的影响;②掌握CEEMDAN信号分解技术及其参数优化方法;③研究混合储能系统在平抑功率波动中的协调控制策略;④应用灰狼优化算法等智能优化技术解决工程实际中的多参数寻优问题;⑤开展新能源并网系统仿真建模与性能评估。; 阅读建议:此资源以Matlab代码实现为核心,建议读者结合信号处理理论、储能系统建模与智能优化算法进行系统学习,重点剖析GWO优化CEEMDAN的实现流程、功率分配规则的设计逻辑,并通过对比仿真实验深入理解该策略的性能优势与工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值