意甲冠军:

一m*n该网络的规模格。详细地点称为伞兵着陆(行和列)。

现在,在一排(或列)

安装激光枪,激光枪可以杀死线(或塔)所有伞兵。在第一i安装一排

费用是Ri。在第i列安装的费用是Ci。

要安装整个激光枪系统,总费用为这些

激光枪费用的乘积。

求杀死全部伞兵的最小费用。

构图:

把伞兵视为边,行与列视为顶点。添加源点和汇点,对于第i行。从源点向顶点i连接一条

容量为Ri的边。对于第j列。从顶点j向汇点连接一条容量为Rj的边。

假设某一点(i,j)有伞兵降落,则从顶点Ri向顶点Cj连接一条容量为无穷大的边。

算法:

依据割的性质,源点和汇点必不连通。则割边必然在S->R,R->C,C->T其一。

为了求得最小容量,

将R->C设为无穷大,则其不可能被选中。这样割边集为S-->R,C-->T的集合,也就是选中行或列。

此时求得的最小割为花费最小的方案。

因为花费为行和列的乘积。则通过对数运算把乘法转化为加法。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#define maxm 15000
#define maxn 105
#define eps 1e-6
using namespace std; struct node
{
int v,next;
double val;
}e[maxm<<1];
int st,en,n,m,l,cnt;
int d[maxn];
int head[maxn],cur[maxn];
const double INF = 1000007;
queue<int> q; void init()
{
st = 0,en = n+m+1;
memset(head,-1,sizeof(head));
cnt = 0;
}
void add(int x,int y,double z)
{
e[cnt].v = y;
e[cnt].val = z;
e[cnt].next = head[x];
head[x]=cnt++;
e[cnt].v = x;
e[cnt].val = 0;
e[cnt].next = head[y];
head[y]=cnt++;
}
bool bfs()
{
while(!q.empty())
q.pop();
memset(d,-1,sizeof(d));
int u;
d[st] = 0;
q.push(st);
while(!q.empty())
{
u = q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].next)
{
int t = e[i].v;
if(e[i].val>0 && d[t]==-1)
{
d[t] = d[u]+1;
q.push(t);
if(t==en) return true;
}
}
}
return false;
} double dfs(int x,double flow)
{
if(x==en || fabs(flow)<=eps) return flow;
double ret = 0,dd;
for(int& i=cur[x];i!=-1;i=e[i].next)
{
int t = e[i].v;
if(d[t] == d[x]+1 && (dd = dfs(t,min(flow,e[i].val)))>0)
{
e[i].val-=dd;
e[i^1].val+=dd;
flow-=dd;
ret+=dd;
if (fabs(flow) <= eps) break;
}
}
return ret;
}
double Dinic()
{
double tmp = 0,maxflow = 0;
while(bfs())
{
for(int i=0;i<=en;i++)
cur[i] = head[i];
maxflow+=dfs(st,INF);
}
return maxflow;
} int main()
{
int T,a,b;
double x;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&m,&n,&l);
init();
for(int i=1;i<=m;i++)
{
scanf("%lf",&x);
add(st,i,log(x));
}
for(int i=1;i<=n;i++)
{
scanf("%lf",&x);
add(i+m,en,log(x));
}
for(int i=1;i<=l;i++)
{
scanf("%d%d",&a,&b);
add(a,b+m,INF);
}
printf("%.4f\n",exp(Dinic()));
}
return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

zoj 2874 &amp; poj 3308 Paratroopers (最小割)的更多相关文章

  1. 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 ...

  2. POJ - 3308 Paratroopers (最小点权覆盖)

    题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...

  3. POJ - 3308 Paratroopers(最大流)

    1.这道题学了个单词,product 还有 乘积 的意思.. 题意就是在一个 m*n的矩阵中,放入L个敌军的伞兵,而我军要在伞兵落地的瞬间将其消灭.现在我军用一种激光枪组建一个防御系统,这种枪可以安装 ...

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

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

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

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

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

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

  7. Paratroopers(最小割模型)

    http://poj.org/problem?id=3308 题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这 ...

  8. poj 3084(最小割)

    题目链接:http://poj.org/problem?id=3084 思路:题目的意思是不让入侵者进入保护的房间,至少需要锁几道门.网络流建模:设一个超级源点,源点与有入侵者的房间相连,边容量为in ...

  9. poj 1815(最小割、割集)

    题目链接:http://poj.org/problem?id=1815 思路:题目要求是剔除多少个点,可以将其转化为剔除多少条边,因此需要拆点,将点i拆成i,i+n,便容量为1,表示每个人起的传递作用 ...

随机推荐

  1. StringBuilder、StringBuffer和String三者的联系和区别(转)

    StringBuilder.StringBuffer和String三者的联系和区别 1. String 类    String的值是不可变的,这就导致每次对String的操作都会生成新的String对 ...

  2. uva live-2322 - Wooden Sticks

    首先排个序,然后找一次0花费,然后再找一次0花费,然后再找一次0花费,然后再找一次0花费......... 最后看找了几次,+1就是答案 #include<iostream> #inclu ...

  3. C#使用Redis集群缓存

    C#使用Redis集群缓存 本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层. 一.背景 系统考虑到高并发的使用场景.对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决.对于系 ...

  4. loj1336(数学)

    传送门:Sigma Function 题意:定义f(n)为n的约数之和,求[1,n]中f值为偶数的数的个数. 分析:由题目给定公式可知,若f(n)为奇数,则相乘的每一项都必须为奇数. 每一项为奇数的条 ...

  5. centos 更改hostname

    vim /etc/hosts vim /etc/sysconfig/network hostname hostname mlzboy-centos63

  6. Heritrix与Nutch对比

    Nutch 开发语言:Java http://lucene.apache.org/nutch/ 简介: Apache的子项目之一,属于Lucene项目下的子项目. Nutch是一个基于Lucene,类 ...

  7. ftk学习记(waitbox篇)

    [声明:版权全部.欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到了脚本.那么就看看ftk中demo与script搭配的效果是什么样的? 上面的效果图就相 ...

  8. C++ Primer笔记7_STL之关联容器

    关联容器 与顺序容器不同,关联容器的元素是按keyword来訪问和保存的.而顺序容器中的元素是按他们在容器中的位置来顺序保存的. 关联容器最常见的是map.set.multimap.multiset ...

  9. NAT ALG原理

    1      NAT ALG简介 普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323.SIP等).F ...

  10. 《WordPress插件开发手冊》文件夹

    翻译前言:国内没有关于WordPress插件开发比較具体而且系统的资料 前言 第一章:准备一个本地开发环境 介绍 在你的电脑上安装一个站点server 下载并配置一个本地的WordPress 创建一个 ...