http://poj.org/problem?id=3308

题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这一整行或整列的空降兵,给出每一行和每一列安装枪支的花费,总的花费等于所有安装枪支的行和列的花费的乘积。求出最小的总的花费。

思路:(1)最小割:对于图中的两个点(一般为源点和汇点)来说,如果把图中的一些边去掉,如果它们之间无法连通的话,则这些边组成的集合就叫为割了。如果这些边有权值,最小割就是指权值之和最小的一个割。(2)对任意一个只有一个源点和一个汇点的图来说,从源点到汇点的最大流等于最小割,可以用Dinic算法求。由于总的花费等于各花费的乘积,取对数后就能变成和的形式了.

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
const int N=;
const double eps=1e-;
const int INF=<<; struct node
{
int v,u,next;
double w;
} edge[N*];
int head[N],d[N];
int cnt,S,T;
void init()
{
memset(head,-,sizeof(head));
cnt = ;
}
void add(int u,int v,double w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u]=cnt++;
edge[cnt].u = v;
edge[cnt].v = u;
edge[cnt].w = ;
edge[cnt].next = head[v];
head[v]=cnt++;
}
int bfs()
{
queue<int>q;
q.push(S);
memset(d,-,sizeof(d));
d[S] = ;
while(!q.empty())
{
int t = q.front();
q.pop();
for (int j = head[t]; j!=-; j=edge[j].next)
{
int v = edge[j].v;
if (d[v]==-&&edge[j].w>eps)
{
d[v] = d[t]+;
q.push(v);
}
}
}
if (d[T]>)
return ;
return ;
}
double dinic(int t,double sum)
{ if(t==T)
return sum; for (int i = head[t]; i!=-; i=edge[i].next)
{
double a;
int v = edge[i].v;
double w = edge[i].w;
if (d[v]==d[t]+&&w>eps&&(a=dinic(v,min(sum,w))))
{ edge[i].w-=a;
edge[i^].w+=a;
return a;
}
}
return ;
}
int main()
{
int t,m,n,l;
int u,v;
double val;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d%d",&m,&n,&l);
S = ;
T=n+m+;
for (int i = ; i <= m; i++)
{
scanf("%lf",&val);
add(S,i,log(val));
}
for (int i = ; i <= n; i++)
{
scanf("%lf",&val);
add(m+i,T,log(val));
}
while(l--)
{
scanf("%d%d",&u,&v);
add(u,v+m,INF);
}
double ans = ;
while(bfs())
{
double ss = dinic(S,INF);
if(ss>eps)
ans+=ss;
else break; }
printf("%.4f\n",exp(ans));
}
return ;
}

Paratroopers(最小割模型)的更多相关文章

  1. bzoj 2039 最小割模型

    比较明显的网络流最小割模型,对于这种模型我们需要先求获利的和,然后减去代价即可. 我们对于第i个人来说, 如果选他,会耗费A[I]的代价,那么(source,i,a[i])代表选他之后的代价,如果不选 ...

  2. 2019 HDU 多校赛第二场 HDU 6598 Harmonious Army 构造最小割模型

    题意: 有n个士兵,你可以选择让它成为战士还是法师. 有m对关系,u和v 如果同时为战士那么你可以获得a的权值 如果同时为法师,你可以获得c的权值, 如果一个为战士一个是法师,你可以获得b的权值 问你 ...

  3. POJ 3308 Paratroopers(最小割EK(邻接表&矩阵))

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

  4. 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1764  Solved: 965 Description Inp ...

  5. HDU 6634 网络流最小割模型 启发式合并

    如果我们先手拿完所有苹果再去考虑花费的话. S -> 摄像头 -> 苹果 -> T 就相当于找到一个最小割使得S和T分开. ans = sum - flow. 然后对于这一个模型, ...

  6. bzoj 1497 最小割模型

    我们可以对于消费和盈利的点建立二分图,开始答案为所有的盈利和, 那么源向消费的点连边,流量为消费值,盈利向汇连边,流量为盈利值 中间盈利对应的消费连边,流量为INF,那么我们求这张图的最小割,用 开始 ...

  7. tyvj P1209 - 拦截导弹 平面图最小割&&模型转化

    P1209 - 拦截导弹 From admin    Normal (OI)总时限:6s    内存限制:128MB    代码长度限制:64KB 背景 Background 实中编程者联盟为了培养技 ...

  8. zoj 2874 &amp; poj 3308 Paratroopers (最小割)

    意甲冠军: 一m*n该网络的规模格.详细地点称为伞兵着陆(行和列). 现在,在一排(或列) 安装激光枪,激光枪可以杀死线(或塔)所有伞兵.在第一i安装一排 费用是Ri.在第i列安装的费用是Ci. 要安 ...

  9. POJ 3469 Dual Core CPU(最小割模型的建立)

    分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...

随机推荐

  1. MySql的存储过程和触发器

    Mysql的存储过程是类似于其它编程语言中的函数的功能,存储过程内部可以使用顺序循环和转移三种基本程序结构,而且整个存储过程可以接受和返回参数. 创建存储过程(procedure)时,因为其内部有以; ...

  2. tab下拉显示

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  3. 2018NOIP普及T4---对称二叉树

    题目 对称二叉树   题目描述 思路 检查是否符合对称条件 条件很简单——结构对称&&点权对称 要做到点权对称其实也就顺便结构对称了 于是条件可以简化为点权对称 可以考虑并行搜索 bo ...

  4. 洛谷——P1156 垃圾陷阱

    P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D ...

  5. 关于DEV-c++ 运行窗口闪退的解决办法

    因为程序默认运行结束自动关闭,所以运行窗口会被秒关,反复下载了很多遍也没有解决. 上网看过许多博客后,有好多方法,总结一下: ①在return 0:前加getchar():(getchar():是得到 ...

  6. 制作一个最小Linux系统

    使用的是itop4412开发板(仅记录个人的学习回顾,如有不当之处欢迎指出) ---------致谢 准备:busybox软件.uboot(一般和开发板配套).zImage(kernel内核).ram ...

  7. 脚本开头,python预编译,控制台输入输出,for,while循环,分支判断,break,continue

    3. name = input("name:")与2.x中raw_input一回事, 注意接收的变量全部默认为字符串类型. 从控制台接收用户输入,而密文输入import getpa ...

  8. 作为一个程序员,分享一下我自己常用的几款非常方便的chrome插件

    作为一名资深码农,结合身边一群IT民工的真实体验,小编有那么一点权威给各位推荐几款程序员必备.常用的chrome扩展插件. 1.Click&Clean Click&Clean插件可以监 ...

  9. SQL Server数据库基础编程

    转载,查看原文 Ø Go批处理语句 用于同时执行多个语句 Ø 使用.切换数据库 use master go   Ø 创建.删除数据库 方法1. --判断是否存在该数据库,存在就删除 if (exist ...

  10. 3.3.5 boolean类型

        boolean(布尔)类型有两个值:false 和 true ,用来判定逻辑条件.与Python不同的是,Java中的boolean值与整型值之间进行互相转换.       Python中Tu ...