POJ3469: Dual Core CPU 题解

POJ-3469 Dual Core CPU (最小割) Dual Core CPU 题目链接:Dual Core CPU 题意 思路 照书上的话来说,用最小的费用将对象分成两个集合的问题,常常可以转换成最小割问题,这道题就是一道典型的例子。 具体的还需要证明 记在核A上执行的模块集合是S,而在核B上执行的模块集合为T。考虑以模块为顶点,并且还有额外的源点s和汇点t的图。我们也记图s-t割所对应的包含s的顶点集合为S,包含t的集合为T,然后来考察他们... 阅读详情

这题很考验对最小割的理解

其实题目就是让你合理的安排每个任务是在A做还是在B做

这样的模型可以想到最小割

我们建一个超级源点s和一个超级源点t

设s所属于的集合是S,t所属于的集合是T

我们希望构一个图,使得它的最小割就是答案

对于所有点,向t连一条流量为ai的边,这样所有被分到S的模块在割的时候都会割到ai的边,而在T的模块则不需要割掉这条边

对于所有点,从s向它连一条流量为bi的边,这样所有被分到T的模块在割的时候都会割到bi的边,而在S的模块则不需要割掉这条边

对于每组ai,bi,wi,从ai向bi连一条流量为wi的边,同时从bi向ai也连一条流量为wi的边,这样保证只要ai,bi不属于同一个集合,他们之间的有一条边就一定会被割掉,如果ai,bi同属于一个集合,他们之间的边就一定不会被割掉

于是我们构造出来的图,最小割就是答案

而最小割又等于最大流,于是跑一遍最大流就可以了

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <utility>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <queue>
#include <deque>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define LL long long
#define Pair pair<int,int>
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=2e9;
const int INF=0x7ffffff;
const int magic=348;

int head[200048],nxt[600048],to[600048],f[600048],tot=1;
inline void addedge(int s,int t,int l,int ll)
{
	to[++tot]=t;nxt[tot]=head[s];head[s]=tot;f[tot]=l;
	to[++tot]=s;nxt[tot]=head[t];head[t]=tot;f[tot]=ll;
}

int n,e,t;
int depth[100048];
queue<int> q;

bool bfs()
{
	int i,x,y;
	for (i=0;i<=t;i++) depth[i]=-1;
	depth[0]=0;
	q.push(0);
	while (!q.empty())
	{
		x=q.front();q.pop();
		for (i=head[x];i;i=nxt[i])
		{
			y=to[i];
			if (depth[y]==-1 && f[i])
			{
				depth[y]=depth[x]+1;
				q.push(y);
			}
		}
	}
	if (depth[t]==-1) return false; else return true;
}

int dfs(int x,int maxf)
{
	if (x==t) return maxf;
	int i,y,res=0,minf,now;
	for (i=head[x];i;i=nxt[i])
	{
		y=to[i];
		if (depth[y]==depth[x]+1 && f[i])
		{
			minf=min(maxf-res,f[i]);
			now=dfs(y,minf);
			f[i]-=now;
			f[i^1]+=now;
			res+=now;
		}
	}
	return res;
}

int main ()
{
	int i,a,b,w;
	scanf("%d%d",&n,&e);
	t=n+1;
	for (i=1;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		addedge(i,t,a,0);
		addedge(0,i,b,0);
	}
	for (i=1;i<=e;i++)
	{
		scanf("%d%d%d",&a,&b,&w);
		addedge(a,b,w,w);
		//addedge(b,a,w);
	}
	LL ans=0;
	while (bfs()) ans+=dfs(0,INF);
	cout<<ans<<endl;
	return 0;
}




VisionMaster 4.2.0安装 按照顺序安装。 阅读详情

相关推荐

如何使用Ray和PyTorch训练模型

用户编写训练函数 → 定义单机训练逻辑。通过扩缩容配置 → 指定需要多少资源(Worker 数量、CPU/GPU)。训练器整合训练函数和配置 → 自动将训练函数分发到多个 Worker 上并行执行。Worker 运行训练函数 → 在分布式环境中完成模型训练。通过这种模式,Ray Train 实现了对分布式训练的抽象,用户只需关注单机训练逻辑,无需手动管理分布式通信和资源分配。

m0_62464865的博客 1889

POJ 3469 Dual Core CPU (最大流最小割经典题)

Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24781   Accepted: 10732 Case Time Limit: 5000MS Description As more and more computers

K键盘里的青春K 1062

1.1 了解Spring框架 -《SSM深入解析与项目实战》

文章目录第1篇 基础概念第1章 谈谈SSM框架和Redis1.1 了解Spring框架1.1.1 如何学习Spring1.1.2 IoC(Inversion of Control 控制反转)1.1.3 AOP(Aspect Oriented Programing面向切面编程) 项目中所有的源码都可以在此链接的仓库中找到:https://github.com/chenhaoxiang/uifuture-ssm 本章非常形象的介绍了Springn中最核心的两个概念,IoC和AOP,使用了现实中的例子

谙忆-陈浩翔 2097

poj3469 Dual Core CPU

Dual Core CPU Time Limit:15000MS Memory Limit:131072K Total Submissions:25576 Accepted:11033 Case Time Limit:5000MS Description As more and more comput...

weixin_30241919的博客 187

POJ 3469 Dual Core CPU (最小割)

Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 25064   Accepted: 10860 Case Time Limit: 5000MS Description As more and more computers

Mr_Treeeee的博客 626

Dual Core CPU(最小割)

Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 26136 Accepted: 11270 Case Time Limit: 5000MS Description As more and more computers are equipped with dual c...

苟为蒟蒻又何妨 1182

Dual Core CPU

题目描述 (传送门) 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...

看流云落成雨滴 891

POJ3469Dual Core CPU——题解

http://poj.org/problem?id=3469 题目大意: 两个CPU,处理每个任务有不同的代价,有些对任务如果不在同一个CPU就会增加代价,求最小代价。 ———————————————————————————— 一看,网络流,再一看,最小。 哦,最小割。 咋做啊,不会…… 查题解吧,学一学最小割的建图方法。 哦~~~~这样啊。 割一个图,就是将图中的点分为属于源点...

weixin_33682719的博客 144

Dual Core CPU POJ - 3469

题目大意:n个机器,如果在A工作话费ai,在B工作花费bi,还有m个条件,代表a,b不再一起工作是的额外花费。 解题思路: 如图所示: 如果割掉ax和ay,代表xy同时在A组。 如果割掉bx和by,代表xy同时在B组。 如果割掉ax w 和by代表x在A组y在B组。 如果割掉ay w 和bx 代表x在B组,y在A组。 四种割法代表四种不同的方案,最优的方案即为最小割。 记录一...

1999 325

POJ 3469 Dual Core CPU

题目链接:http://poj.org/problem?id=3469 结合POJ 2987http://blog.csdn.net/u010489766/article/details/9301235, 建图的话,这次没必要建二分图了,每个点都连接源点和汇点就行,源点和汇点就代表他的两个cpu核,一个任务不能在两个核上同时运行,所以要求最小割,即求最大流, 注意:这次两个任务之间的关系是个

u010489766的专栏 834

poj 3469 Dual Core CPU 最大流-最小割

题目:http://poj.org/problem?id=3469 题意:有双核处理器,有n个任务,给出每个任务在分别在两个处理核心上工作的花费,然后有m行,每行给出两个任务,如果两个任务不在同一个处理核心上工作,那么将有额外的花费。求最小花费 思路:碰到的第一题求最小割-最大流的题目,思路不是自己的。将两个CPU分别视为源点和汇点、模块视为顶点,则可以按照以下方式构图:对于第i个模块在每个C

弱智就要多努力 979

Dual Core CPU POJ - 3469 最小割(经典网络流

传送门:POJ3469 题意:  要在核A和核B组成的双核CPU上运行N个模块,模块i在核A上执行的花费为Ai,在核B上执行的花费为Bi。有M个相互之间需要进行数据交换的模块组合(ai,bi),如果这两个模块在同一个核上执行则没有额外花费,否则会产生wi的花费,请计算执行所有模块的最小花费。 思路:在这里只说建图方法,更多解释详见挑战程序设计第二版P236。 1.新建源点和汇点,所有源点向所

WA是一笔财富 515

POJ 3469Dual Core CPU【最小割】

题目: 有两个CPU来处理 NNN 个机器,对于每个机器来说,在两个CPU上处理的费用分别是 AiAiAi 和 BiBiBi 。现在还有 mmm 对机器需要进行数据交换,每对机器的数据交换都有其对应的交换费用,但是如果这两台需要进行数据交换的机器是在相同的CPU上处理的,则不需要支付交换费用。问处理所有机器的最小花费。 思路: 看到了最小花费,因此很自然的想到了最小割模型,于是问题就变成了如何建...

lucius-liu.cn 1579

Poj 3469 Dual Core CPU(最小割)

Poj 3469 Dual Core CPU题目描述题解代码 题目描述 Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 28432 Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Corporation, de

weixin_43308078的博客 220

poj 3469 Dual Core CPU

<br /> <br />建图,源点为A核,汇点为B核,每个顶点有A-> i -> B的两条边。<br /> <br />如果两个顶点不是同一个核需要代价,这两个点建立两条有向边。<br /> <br />相当于求最小割,呃,就是求最大流了 = =。。。刚想明白。。。最小割就是最大流啊。。。<br /> <br />我的dinic模板TLE了 = =。。<br /> <br />搜的一个模板4000+MS过了 = =。。。<br /> <br />哎。。又要好好理解咧。。。<br /> <br />#inc

小媛在努力~ 1609

POJ 3469Dual Core CPU(最小割)

【题意】 【分析】 【建图】 留着有空再写 【Mark】 数据较大,n<=20000。使用dinic的递归写法跑了7s+,非递归TLE.sap跑了2s+。 谁说非递归效率高? 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> ...

dechi5213的博客 178

POJ 3469 Dual Core CPU(最小割,建图)

最大流dinic算法,建图 题目意思: 双核计算机A,B,有n个模块,每个模块都要再CPU中运行,并且知道了每个模块在每个CPU上的运行时间, 如果它们运行在同一个cpu,就可以忽略共享数据的花费,否则需要额外的费用,求完成所有任务的最小花费; 本题要点: 1、最大流量=最小割容量 2、建图 建图:让两个CPU分别为图的源点s和汇点t,已知每个模块与两个CPU的运行时间Ai,Bi,则对于每个模块, 从s连向一条容量为Ai的边到这个模块,在从这个模块连一条容量为Bi的边到t;对于在不同模块运行的模块需要额外的

qq_38232157的博客 218

POJ-3469 Dual Core CPU 网络流

题意:一台双核电脑,给你多个任务,分别给出每个任务在第一个核和第二个核上运行的消耗。后面的m行输入是给出两个任务在两个不同核上运行需要付出的额外消耗。 建图:把每个任务作为节点,在超级源点与任务间的连一条边,其容量为给任务在核1上运行的消耗,在该任务节点与超级汇点之间连一条边,容量为该任务在核2上运行的消耗。            在任务之间连接无向边,容量为两个任务不在同一核上运行的

菜鸟成长ing 690
上一篇: POJ3041: Asteroids 题解
下一篇: POJ2195: Going Home 题解
IcePrincess_1968
博客等级 码龄9年 13粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值