poj 3469 Dual Core CPU
题目描述:
由于越来越多的计算机配置了双核CPU,TinySoft公司的首席技术官员,SetagLilb,决定升
级他们的产品-SWODNIW。
SWODNIW包含了N个模块,每个模块必须运行在某个CPU中。每个模块在每个CPU中
运行的耗费已经被估算出来了,设为Ai和Bi。同时,M对模块之间需要共享数据,如果他们运行
在同一个CPU中,共享数据的耗费可以忽略不计,否则,还需要额外的费用。你必须很好地安排
这N个模块,使得总耗费最小。
思路: 如果将两个CPU分别视为源点和汇点、模块视为顶点,则可以按照以下方式构图:对于第i
个模块在每个CPU中的耗费Ai和Bi, 从源点向顶点i连接一条容量为Ai的弧、从顶点i向汇点
连接一条容量为Bi的弧;对于a模块与b模块在不同CPU中运行造成的额外耗费w,顶点a
与顶点b连接一条容量为w的弧。此时每个顶点(模块)都和源点及汇点(两个CPU)相连,即
每个模块都可以在任意一个CPU中运行
不难了解到,对于图中的任意一个割,源点与汇点必不连通。因此每个顶点(模块)都不可
能同时和源点及汇点(两个CPU)相连,即每个模块只在同一个CPU中运行。此时耗费即为割
的容量。很显然,当割的容量取得最小值时,总耗费最小。故题目转化为求最小割的容量。 #include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 20010
#define maxm 1000000
#define LL long long
struct Eg{
int to;
int next;
int f;
}E[maxm];
int V[maxn],num;
int N,M;
void add(int u,int v,int c){
E[num].to=v;
E[num].f=c;
E[num].next=V[u];
V[u]=num++; E[num].to=u;
E[num].f=;
E[num].next=V[v];
V[v]=num++;
}
int level[maxn];
int qu[maxn];
bool BFS(int s,int t){
int i,iq=;
// memset(level,0,sizeof(level));
for(i=;i<=t;i++) level[i]=;
//queue<int> Q;
int u,v,e;
qu[iq++]=s;// Q.push(s);
level[s]=;
// while(!Q.empty()){
for(i=;i<iq;i++){
u=qu[i];//Q.front();
//Q.pop();
if(u==t) return true;
for(e=V[u];e!=-;e=E[e].next){
v=E[e].to;
if(!level[v]&&E[e].f>)
{
level[v]=level[u]+;
qu[iq++]=v;// Q.push(v);
}
}
}
return false;
}
int cur[maxn];
int dfs(int u,int maxf,int t){
if(u==t||maxf==) return maxf;
int ret=,f,e,v;
for(e=cur[u];e!=-;e=E[e].next){// 当前弧优化
v=E[e].to;
if(E[e].f>&&level[u]+==level[v]){
f= dfs(v,min(maxf,E[e].f),t);
E[e].f-=f;
E[e^].f+=f;
maxf-=f;
ret+=f;
cur[u]=e;
if(maxf==) break;
}
}
return ret;
}
int Dinic(int s,int t){
int flow=;
while(BFS(s,t)){
for(int i=;i<=t;i++)
cur[i]=V[i];
flow+=dfs(s,MOD,t);
}
return flow;
}
int main(){
int i;
int a,b,w;
while(scanf("%d %d",&N,&M)!=EOF){
for(i=;i<=N+;i++)V[i]=-;
num=;
for(i=;i<=N;i++){
scanf("%d %d",&a,&b);
add(,i,a);
add(i,N+,b);
}
while(M--){
scanf("%d %d %d",&a,&b,&w);
add(a,b,w);
add(b,a,w);
}
printf("%d\n",Dinic(,N+));
} return ;
}
poj 3469 Dual Core CPU的更多相关文章
- POJ 3469.Dual Core CPU 最大流dinic算法模板
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 24830 Accepted: 10756 ...
- POJ 3469 Dual Core CPU Dual Core CPU
Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 23780 Accepted: 10338 Case Time Lim ...
- poj 3469 Dual Core CPU【求最小割容量】
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 21453 Accepted: 9297 ...
- POJ 3469 Dual Core CPU(最小割)
[题目链接] http://poj.org/problem?id=3469 [题目大意] 有N个模块要在A,B两台机器上执行,在不同机器上有不同的花费 另有M个模块组(a,b),如果a和b在同一台机子 ...
- poj 3469 Dual Core CPU——最小割
题目:http://poj.org/problem?id=3469 最小割裸题. 那个限制就是在 i.j 之间连双向边. 根据本题能引出网络流中二元关系的种种. 别忘了写 if ( x==n+1 ) ...
- POJ 3469 Dual Core CPU (最小割建模)
题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...
- 【网络流#8】POJ 3469 Dual Core CPU 最小割【ISAP模板】 - 《挑战程序设计竞赛》例题
[题意]有n个程序,分别在两个内核中运行,程序i在内核A上运行代价为ai,在内核B上运行的代价为bi,现在有程序间数据交换,如果两个程序在同一核上运行,则不产生额外代价,在不同核上运行则产生Cij的额 ...
- poj 3469 Dual Core CPU 最小割
题目链接 好裸的题....... 两个cpu分别作为源点和汇点, 每个cpu向元件连边, 权值为题目所给的两个值, 如果两个元件之间有关系, 就在这两个元件之间连边, 权值为消耗,这里的边应该是双向边 ...
- POJ - 3469 Dual Core CPU (最小割)
(点击此处查看原题) 题意介绍 在一个由核A和核B组成的双核CPU上执行N个任务,任务i在核A上执行,花费Ai,在核B上执行,花费为Bi,而某两个任务之间可能需要进数据交互,如果两个任务在同一个核上执 ...
随机推荐
- JavaScript高级---门面模式设计
门面模式 两个作用: 1.简化类的接口 2.消除类与使用它的客户代码之间的耦合 门面模式常常是开发人员最亲密的朋友.它几乎是所有javascript库的核心原则 门面模式的目的是为了让开发人员用更简单 ...
- Filter及FilterChain的使用详解(转)
一.Filter的介绍及使用 什么是过滤器? 与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中.但是与其他web应用程序组件不同的是,过滤器是"链&quo ...
- Sqlitekit 封装管理
最近需要用到Sqlite数据库来做一个游戏的数据存储.网上搜了一下,两种方法,一种是自己dll搭建环境有可能还需要编译之类的,我自己是搭建出来了,不过我没采用. 还有一种就是使用sqlitekit插件 ...
- HTTP/2 对 Web 性能的影响(下)
一.前言 我们在 HTTP/2 对 Web 性能的影响(上)已经和大家分享了一些关于 Http2 的二项制帧.多用复路以及 APM 工具等,本文作为姊妹篇,主要从 http2 对 Web 性能的影响. ...
- poj 2387 Til the Cows Come Home (最短路,dijkstra模版题)
题目 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include<stdio.h> #include<math ...
- POJ 3461 Oulipo(字符串匹配,KMP算法)
题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距 ...
- JsRender系列demo(3)-自定义容器
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- MySQL.. ERROR! The server quit without updating PID file问题解决
不小心将服务器OS给重启了,再启动数据库的时候,出现了很奇怪的问题 [root@dev run]# service mysql restart ERROR! MySQL server PID file ...
- httpclient发送multipart/form-data类型参数和用MultipartRequest接收参数
一.利用HttpClient发送基于Content-Type="multipart/form-data"形式的表单 package com.test.httpclient; imp ...
- 220 DIV2 B. Inna and Nine
220 DIV2 B. Inna and Nine input 369727 output 2 input 123456789987654321 output 1 题意:比如例子1:369727--& ...