题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费。

一开始想的时候以为是费用流,但想着想着觉得,这么大的数据量绝对不可能是费用流。最后发现它是一个最小割模型。实际上就是要将网络里的模块划分成s-t两个点集,然后我们合适的构造一下边就可以使得对应的最小割就是我们的答案,构造的方法是这样的:当模块属于A集的时候,花费为ai,所以就从向t连一条ai的边,而当模块属于B集的时候,花费为bi,所以就由s连一条向bi的边。然后对于每个任务,当ai,bi不同的时候花费为mi,所以就由ai,bi连两条容量为wi的边,跑一下最大流就可以得出对应的最小花费了。代码将《挑战》上的模板化了一下,以后用起来会方便点吧~

  1. #pragma warning(disable:4996)
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<cmath>
  9. #include<queue>
  10. #define ll long long
  11. #define maxn 23500
  12. #define maxe 1000000
  13. #define inf 1100000000
  14. using namespace std;
  15.  
  16. struct Edge
  17. {
  18. int u, v, cap;
  19. int nxt;
  20. }edge[maxe];
  21.  
  22. int head[maxn];
  23. int n, m;
  24.  
  25. struct Dicnic
  26. {
  27. int level[maxn];
  28. int iter[maxn];
  29. int add;
  30. void init(){
  31. add = 0; memset(head, -1, sizeof(head));
  32. memset(iter, -1, sizeof(iter));
  33. }
  34. void insert(int u, int v, int c){
  35. edge[add].u = u; edge[add].v = v; edge[add].cap = c;
  36. edge[add].nxt = head[u]; head[u] = add++;
  37. edge[add].u = v; edge[add].v = u; edge[add].cap = 0;
  38. edge[add].nxt = head[v]; head[v] = add++;
  39. }
  40. void bfs(int s){
  41. memset(level, -1, sizeof(level));
  42. queue<int> que;
  43. level[s] = 0;
  44. que.push(s);
  45. while (!que.empty()){
  46. int v = que.front(); que.pop();
  47. for (int i = head[v]; i != -1; i = edge[i].nxt){
  48. Edge &e = edge[i];
  49. if (e.cap > 0 && level[e.v] < 0){
  50. level[e.v] = level[v] + 1;
  51. que.push(e.v);
  52. }
  53. }
  54. }
  55. }
  56.  
  57. int dfs(int v, int t, int f){
  58. if (v == t) return f;
  59. for (int &i = iter[v]; i != -1; i = edge[i].nxt){
  60. Edge &e = edge[i]; Edge &reve = edge[i ^ 1];
  61. if (e.cap > 0 && level[v] < level[e.v]){
  62. int d = dfs(e.v, t, min(f, e.cap));
  63. if (d>0){
  64. e.cap -= d; reve.cap += d;
  65. return d;
  66. }
  67. }
  68. }
  69. return 0;
  70. }
  71.  
  72. int max_flow(int s, int t){
  73. int flow = 0;
  74. for (;;){
  75. bfs(s);
  76. if (level[t] < 0) return flow;
  77. memcpy(iter, head, sizeof(iter));
  78. int f;
  79. while ((f = dfs(s, t, inf))>0){
  80. flow += f;
  81. }
  82. }
  83. }
  84. }net;
  85.  
  86. int a[maxn], b[maxn];
  87.  
  88. int main()
  89. {
  90. while (cin >> n >> m){
  91. net.init();
  92. int s = 0, t = n + 1;
  93. for (int i = 1; i <= n; i++) {
  94. scanf("%d", a + i); scanf("%d", b + i);
  95. net.insert(i, t, a[i]);
  96. net.insert(s, i, b[i]);
  97. }
  98. int ui, vi, wi;
  99. for (int i = 0; i < m; i++){
  100. scanf("%d%d%d", &ui, &vi, &wi);
  101. net.insert(ui, vi, wi);
  102. net.insert(vi, ui, wi);
  103. }
  104. printf("%d\n", net.max_flow(s,t));
  105. }
  106. return 0;
  107. }

POJ3469 Dual Core CPU(最小割)的更多相关文章

  1. poj3469 Dual Core CPU——最小割

    题目:http://poj.org/problem?id=3469 最小割水题(竟然没能1A): 代码如下: #include<iostream> #include<cstdio&g ...

  2. POJ 3469 Dual Core CPU (最小割建模)

    题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...

  3. 【网络流#8】POJ 3469 Dual Core CPU 最小割【ISAP模板】 - 《挑战程序设计竞赛》例题

    [题意]有n个程序,分别在两个内核中运行,程序i在内核A上运行代价为ai,在内核B上运行的代价为bi,现在有程序间数据交换,如果两个程序在同一核上运行,则不产生额外代价,在不同核上运行则产生Cij的额 ...

  4. poj 3469 Dual Core CPU——最小割

    题目:http://poj.org/problem?id=3469 最小割裸题. 那个限制就是在 i.j 之间连双向边. 根据本题能引出网络流中二元关系的种种. 别忘了写 if ( x==n+1 ) ...

  5. poj 3469 Dual Core CPU 最小割

    题目链接 好裸的题....... 两个cpu分别作为源点和汇点, 每个cpu向元件连边, 权值为题目所给的两个值, 如果两个元件之间有关系, 就在这两个元件之间连边, 权值为消耗,这里的边应该是双向边 ...

  6. poj3469 Dual Core CPU

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 25576   Accepted: 11033 ...

  7. POJ3469 Dual Core CPU(最小割)

    形象生动的最小割.. #include<cstdio> #include<cstring> #include<queue> #include<algorith ...

  8. 【做题】POJ3469 Dual Core CPU——第一道网络流

    刚学了Dinic就开始做题,然后就崩了. 题意:若干个任务,可以放在两个CPU中任意一个上完成,各有一定代价.其中又有若干对任务,如果它们不在同一个CPU上完成,会产生额外代价.最小化并输出代价. 一 ...

  9. poj 3469 Dual Core CPU【求最小割容量】

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 21453   Accepted: 9297 ...

随机推荐

  1. java中的接口回调

    [接口回调]接口回调是多态的另一种体现.接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法.当接口变量调用被类实现的接口中 ...

  2. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  3. 反射 reflect 初始学习

    类也是对象,本身是java.lang.Class 类的对象. Class的三种表示方式: 1.Class a = A.class: 类名.class的方式.经常在日志记录里面,获取当前类的日志记录生成 ...

  4. 'mysql.column_stats' doesn't exist and Table 'mysql.index_stats' doesn't exist

    在生产库MariabDB中修改字段类型,提示如下错误:​Table 'mysql.column_stats' doesn't existTable 'mysql.index_stats' doesn' ...

  5. Php+Redis 实现Redis提供的lua脚本功能

    <?php require_once "predis-0.8/autoload.php"; $config['schema'] = 'tcp'; $config['host' ...

  6. SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍 SQL Server支持的两种批 ...

  7. html 元素 变小手

    要设置鼠标指针放在一个元素边界范围内时所用的光标形状,需要对元素的css属性cursor进行设置.cursor属性可能的值1.default 默认光标(通常是一个箭头)2.auto 默认.浏览器设置的 ...

  8. WPF——数据绑定(二)绑定方法—绑定本地对象

    注意:本人初学WPF,文中表达或技术性问题请勿见怪,欢迎指正,谢谢 标记拓展语法:绑定到本地对象 什么是绑定到本地对象,我个人理解就是实现UI层上两个或多个控件的相互关联,一个控件的状态改变,导致另一 ...

  9. java类中定义接口

    今天看到一个java类中定义了接口,写个备忘录,记录一下 package com.gxf.test; public class Test_interface { public interface sh ...

  10. xml给提示

    1.     FAQ:不给提示: a)     window – preferences – myeclipse – xml – xml catalog b)     User Specified E ...