题目是一个非常明显的二分图带权匹配模型,

加入源点到nx建边,ny到汇点建边,(nx。ny)=inf建边。求最小割既得最小点权覆盖。

在本题中因为求的是乘积,所以先所有取log转换为加法,最后再乘方回来。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <string>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <queue>
  9. #include <map>
  10. #define inf 0x3f3f3f3f
  11. #define eps 1e-6
  12. #define ll __int64
  13. const int maxn=110;
  14. using namespace std;
  15.  
  16. int n,s,t,level[maxn];
  17. double c[maxn][maxn];
  18.  
  19. bool makelevel()
  20. {
  21. memset(level,0,sizeof level);
  22. level[s]=1;
  23. int q[maxn];
  24. int fro=0,iq=0;
  25. q[iq++]=s;
  26. int i,v;
  27. while(fro!=iq)
  28. {
  29. v=q[fro++];
  30. for(i=0;i<=t;i++)
  31. {
  32. if(!level[i]&&c[v][i])
  33. {
  34. level[i]=level[v]+1;
  35. q[iq++]=i;
  36. }
  37. }
  38. }
  39. if(!level[t]) return 0;
  40. return 1;
  41. }
  42.  
  43. double dfs(int now,double maxf)
  44. {
  45. if(now==t) return maxf;
  46. double ret=0;
  47. for(int i=0;maxf!=0&&i<=t;i++)
  48. {
  49. if(c[now][i]&&level[now]+1==level[i])
  50. {
  51. double tmp=dfs(i,min(maxf,c[now][i]));
  52. c[now][i]-=tmp;
  53. c[i][now]+=tmp;
  54. ret+=tmp;
  55. maxf-=tmp;
  56. }
  57. }
  58. return ret;
  59. }
  60.  
  61. double dinic()
  62. {
  63. double ans=0;
  64. while(makelevel()) ans+=dfs(s,10000000);
  65. return ans;
  66. }
  67.  
  68. int main()
  69. {
  70. int icy,m,l,i,aa,bb;
  71. double a,b;
  72. scanf("%d",&icy);
  73. while(icy--)
  74. {
  75. scanf("%d%d%d",&m,&n,&l);
  76. s=0;t=n+m+1;
  77. memset(c,0,sizeof c);
  78. for(i=1;i<=m;i++)
  79. {
  80. scanf("%lf",&a);
  81. c[0][i]=log(a);
  82. }
  83. for(i=1;i<=n;i++)
  84. {
  85. scanf("%lf",&a);
  86. c[i+m][t]=log(a);
  87. }
  88. for(i=0;i<l;i++)
  89. {
  90. scanf("%d%d",&aa,&bb);
  91. c[aa][bb+m]=10000000;
  92. }
  93. printf("%.4lf\n",exp(dinic()));
  94. }
  95. return 0;
  96. }

poj3308 Paratroopers --- 最小点权覆盖-&gt;最小割的更多相关文章

  1. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  2. poj 3308(最小点权覆盖、最小割)

    题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...

  3. poj 2125 Destroying The Graph (最小点权覆盖)

    Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS   Memory Limit: 65536K       ...

  4. POJ3308 Paratroopers(最小割/二分图最小点权覆盖)

    把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...

  5. poj3308 Paratroopers 最大流 最小点权覆盖

    题意:有一个n*m的矩阵,告诉了在每一行或者每一列安装大炮的代价,每一个大炮可以瞬间消灭这一行或者这一列的所有敌人,然后告诉了敌人可能出现的L个坐标位置,问如何安置大炮,使花费最小.如果一个敌人位于第 ...

  6. POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)

    http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ...

  7. POJ 3308 Paratroopers(最大流最小割の最小点权覆盖)

    Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ...

  8. poj 3308 Paratroopers(二分图最小点权覆盖)

    Paratroopers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8954   Accepted: 2702 Desc ...

  9. POJ 3308 Paratroopers (对数转换+最小点权覆盖)

    题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...

随机推荐

  1. MySQL对于有大量重复数据表的处理方法

    需要在MySQL的一张innodb引擎的表(tableA)上添加一个唯一索引(idx_col1_u).但是对于每个key(col1)表中已经有大量重复数据.此时,做数据的手工清理,或者SQL处理是非常 ...

  2. [置顶] MongoDB 分布式操作——分片操作

    MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...

  3. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  4. ps快速删除圆角图片旁白的白色区域方法

    简单实用5招的ps快速删除圆角图片旁白的白色区域方法 1.图像-模式-rgb颜色 2.双击背景取消图层锁定 3.用魔棒工具点击要删除的区域 4.delete删除 5.另存为png图片

  5. JavaScript 高级程序设计(第3版)笔记——chapter7:函数表达式

    一.函数表达式的语法形式 匿名函数 var functionName = function(arg0, arg1, arg2) { //函数体 } 二.函数表达式没有函数提升 var a = 1; i ...

  6. [译]Stairway to Integration Services Level 16 – Flexible Source Locations (多文件导入)

    介绍 在本文中我们将利用SSIS参数,变量 以及 Foreach Loop Container 从多个源动态导入数据. 开始前我们先下载一些数据.WeatherData_Dec08_Apr09.zip ...

  7. Hive环境搭建心得(Ubuntu)

    Hive是什么? 基于Hadoop的数据查询工具,可以使用类SQL进行数据查询. Hadoop安装 参考了Hadoop安装 注意到etc/hadoop/hadoop-env.sh里设置JAVA_HOM ...

  8. js 模板引擎 jade使用语法

    Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...

  9. URAL 1146 Maximum Sum 最大子矩阵和

    题目:click here #include <bits/stdc++.h> using namespace std; typedef unsigned long long ll; con ...

  10. linux c: 静态库和动态库的生成和使用

    场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i ...