意甲冠军:

一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. [Android学习笔记]View的draw过程学习

    View从创建到显示到屏幕需要经历几个过程: measure -> layout -> draw measure过程:计算view所占屏幕大小layout过程:设置view在屏幕的位置dr ...

  2. [Android学习笔记]startActivityForResult和onActivityResult的使用

    发开过程中,免不了多个页面之间相互交互通信. Android中使用startActivityForResult方法和onActivityResult配合完成任务 startActivityForRes ...

  3. 解决CentOS无法显示中文字体 | 系统运维 | Web2.0

    解决CentOS无法显示中文字体 | 系统运维 | Web2.0 About Me    博客园    devops    前端    张家港水蜜桃 傍晚好! 2013年09月12日 17:56:08 ...

  4. Visual Leak Detector(vld)无法显示内存泄露文件名称与行号

    使用VLD測有没内存泄露的时候,出现(File and line number not available): (Function name unavailable) 查看VS控制台,发现 已载入&q ...

  5. POJ--3268--Silver Cow Party【SPFA+邻接表】

    题意:一些牛要去某一点參加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少须要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其它各个点的最短路径.从牛的家中走到聚会地点,能够把 ...

  6. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  7. HDU 4916 树分治

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. 自动更改IP地址反爬虫封锁,支持多线程(转)

    8年多爬虫经验的人告诉你,国内ADSL是王道,多申请些线路,分布在多个不同的电信机房,能跨省跨市更好,我这里写好的断线重拨组件,你可以直接使用. ADSL拨号上网使用动态IP地址,每一次拨号得到的IP ...

  9. COLORREF和COLOR和RGB的总结

    一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...

  10. Linux 文件系统(二)---运行过程及结构间的关系

    (内核2.4.37) 一.首先.看看磁盘.超级块,inode节点在物理上总体的分布情况: (图示来自:www.daoluan.net) 对于一个分区,相应一个文件系统,一个文件系统事实上本质上还是磁盘 ...