POJ3469Dual Core CPU
题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费。
分析: 用最小的费用将对象划分成两个集合的问题,常常可以转化成最小割后解决,这题就是一道经典的问题;
1.考虑把N个模块按照在那个核执行分成两个集合。在A执行为集合S,B为T。
2.当模块属于A集的时候,花费为ai,所以就从向t连一条ai的边,而当模块属于B集的时候,花费为bi,所以就由s连一条向bi的边。然后对于每个任务,当ai,bi不同的时候花费为mi,所以就由ai,bi连两条容量为wi的边,跑一下最大流就可以得出对应的最小花费了
3.为什么会想到这些呢?首先来了解下:最小割,就是在流向图上去掉数量最少容量最小的边,使这个图变得不连通,源点s无法到达汇点t,这些边组成的容量就是最小割。那我们是不是可以想到,与最小费用进行对比,如果我们建的图是满足最小割为答案的话,那我们就可以很容易解决问题了;
4. 大佬文献
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
#define maxn 23500
#define maxe 1000000
#define inf 1100000000
using namespace std; struct Edge
{
int u, v, cap;
int nxt;
}edge[maxe]; int head[maxn];
int n, m; struct Dicnic
{
int level[maxn];
int iter[maxn];
int add;
void init(){
add = ; memset(head, -, sizeof(head));
memset(iter, -, sizeof(iter));
}
void insert(int u, int v, int c){
edge[add].u = u; edge[add].v = v; edge[add].cap = c;
edge[add].nxt = head[u]; head[u] = add++;
edge[add].u = v; edge[add].v = u; edge[add].cap = ;
edge[add].nxt = head[v]; head[v] = add++;
}
void bfs(int s){
memset(level, -, sizeof(level));
queue<int> que;
level[s] = ;
que.push(s);
while (!que.empty()){
int v = que.front(); que.pop();
for (int i = head[v]; i != -; i = edge[i].nxt){
Edge &e = edge[i];
if (e.cap > && level[e.v] < ){
level[e.v] = level[v] + ;
que.push(e.v);
}
}
}
} int dfs(int v, int t, int f){
if (v == t) return f;
for (int &i = iter[v]; i != -; i = edge[i].nxt){
Edge &e = edge[i]; Edge &reve = edge[i ^ ];
if (e.cap > && level[v] < level[e.v]){
int d = dfs(e.v, t, min(f, e.cap));
if (d>){
e.cap -= d; reve.cap += d;
return d;
}
}
}
return ;
} int max_flow(int s, int t){
int flow = ;
for (;;){
bfs(s);
if (level[t] < ) return flow;
memcpy(iter, head, sizeof(iter));
int f;
while ((f = dfs(s, t, inf))>){
flow += f;
}
}
}
}net; int a[maxn], b[maxn]; int main()
{
while (cin >> n >> m){
net.init();
int s = , t = n + ;
for (int i = ; i <= n; i++) {
scanf("%d", a + i); scanf("%d", b + i);
net.insert(i, t, a[i]);
net.insert(s, i, b[i]);
}
int ui, vi, wi;
for (int i = ; i < m; i++){
scanf("%d%d%d", &ui, &vi, &wi);
net.insert(ui, vi, wi);
net.insert(vi, ui, wi);
}
printf("%d\n", net.max_flow(s,t));
}
return ;
}
POJ3469Dual Core CPU的更多相关文章
- Inter Core CPU 型号的尾字母含义
Inter Core CPU 型号的尾字母含义: M:表示移动处理器(Mobile Processor):QM:四核移动处理器(Quad Mobile Processor):U:超低电压处理器(Ult ...
- Dual Core CPU
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 20935 Accepted: 9054 Case ...
- poj 3469 Dual Core CPU【求最小割容量】
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 21453 Accepted: 9297 ...
- POJ 3469.Dual Core CPU 最大流dinic算法模板
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 24830 Accepted: 10756 ...
- 2018.06.27Dual Core CPU(最小割)
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 26136 Accepted: 11270 Cas ...
- POJ 3469 Dual Core CPU Dual Core CPU
Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 23780 Accepted: 10338 Case Time Lim ...
- poj3469 Dual Core CPU
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 25576 Accepted: 11033 ...
- POJ 3469 Dual Core CPU (最小割建模)
题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...
- poj 3469 Dual Core CPU
题目描述:由于越来越多的计算机配置了双核CPU,TinySoft公司的首席技术官员,SetagLilb,决定升级他们的产品-SWODNIW.SWODNIW包含了N个模块,每个模块必须运行在某个CPU中 ...
随机推荐
- 关于taskaffinity属性的作用
意味着这activity更喜欢哪个TESK,具体见下方说明 当一个包含FLAG_ACTIVITY_NEW_TASK标志的intent启动一个activity时. 一个新的activity,默认地启动到 ...
- css水平居中,竖直居中技巧(一)
css水平居中,竖直居中技巧(一)===### 1.效果 ### 2.代码#### 2.1.index.html <!DOCTYPE html> <html lang="z ...
- Lucene源码解析--Analyzer之Tokenizer
Analyzer包含两个核心组件,Tokenizer以及TokenFilter.两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流.Tokenizer是Analyzer的第一步,其构造函数 ...
- cmake中设置ELF文件加载动态库的位置
1. 三个文件 1. world.c #include<stdio.h> void world(void) { printf("world.\n"); } 2. hel ...
- ARC059F
传送门 分析 见ptx大爷博客 代码 #include<iostream> #include<cstdio> #include<cstring> #include& ...
- PossibleOrders TopCoder - 1643
传送门 分析 先用并查集将所有相等元素连为一个,得到不同的元素共cnt种,之后我们的任务便转化为将这些元素分为k组(k≤cnt),所以我们不难得出dp式:dpij=dpi-1j-1*j+dpi-1j* ...
- 启动应用程序的Activty多种方式
启动应用程序的Activity总共有三种方式,如下: 1>通过包名得到将启动应用的入口Activity,然后给intent附上相应的属性即可. 示例代码 public static void s ...
- ISE 14.7 XST.exe stop working
http://www.xilinx.com/support/answers/59851.html Description XST completes but then instead of retur ...
- <超越死亡:恩宠与勇气>节选
我有一副身体,但我并非自己的身体.我可以看见并感觉到我的身体,然而凡是可以被看见以及被感觉到的,并不是真正的观者.我的身体也许疲惫或兴奋,生病或健康,沉重或轻松,也可能焦虑或平静,但这与内在的真我全然 ...
- Java50道经典习题-程序24 根据输入求输出
题目:给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字.分析: (1)利用随机函数产生[1,99999]之间的一个正整数n (2)将n转换成字符串s,调用字符串的length( ...