POJ 3308 Paratroopers(最小割EK)
题意 : 有一个n*m的矩阵,L个伞兵可能落在某些点上,这些点的坐标已知,需要在某些位置安上一些枪,然后每个枪可以将一行或者一列的伞兵击毙。把这种枪安装到不同行的行首、或者不同列的列首,费用都不同。现在已知把激光枪安装到任意位置的费用,总的花费为这些安装了激光枪的行列花费的乘积。
思路 :就是一个最大流问题。Dinic我不会,用的白皮书上的EK算法,嗯,还行,这个建图比较麻烦,就是把行列分开,成为m+n+1个点。嗯,不废话了,还是把大神博客链接弄过来吧,各方面都讲得很详细。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <math.h> using namespace std; const int maxn = ;
const int INF = ;
double a[maxn],cap[maxn][maxn],flow[maxn][maxn] ;
double f ;
int p[maxn] ;
int m,n,l; void EK(int s)
{
queue<int>Q ;
memset(flow,,sizeof(flow)) ;
f = ;
for( ; ; )
{
memset(p,-,sizeof(p)) ;
memset(a,,sizeof(a)) ;
a[s] = INF ;
Q.push(s) ;
while(!Q.empty())
{
int u = Q.front() ;Q.pop() ;
for(int v = ; v <= m+n+ ; v++)
{
if(!a[v] && cap[u][v] > flow[u][v])
{
p[v] = u ;
Q.push(v) ;
a[v] = min(a[u],cap[u][v]-flow[u][v]) ;
}
}
}
if(a[m+n+] == ) break ;
for(int u = m+n+ ; u != ; u = p[u])
{
flow[p[u]][u] += a[m+n+] ;
flow[u][p[u]] -= a[m+n+] ;
}
f += a[m+n+] ;
}
}
int main()
{
int T;
scanf("%d",&T) ;
while(T--)
{
memset(cap,,sizeof(cap)) ;
f = ;
double s ;
int x,y ;
scanf("%d %d %d",&m,&n,&l) ;
for(int i = ; i <= m ; i++)
{
scanf("%lf",&s) ;
cap[][i] = log(s) ;
}
for(int i = m+ ; i <= m+n ; i++)
{
scanf("%lf",&s) ;
cap[i][m+n+] = log(s) ;
}
for(int i = ; i < l ; i++)
{
scanf("%d %d",&x,&y) ;
cap[x][m+y] = INF ;
}
EK() ;
printf("%.4f\n",exp(f)) ;
}
return ;
}
POJ 3308 Paratroopers(最小割EK)的更多相关文章
- 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 ...
- zoj 2874 & poj 3308 Paratroopers (最小割)
意甲冠军: 一m*n该网络的规模格.详细地点称为伞兵着陆(行和列). 现在,在一排(或列) 安装激光枪,激光枪可以杀死线(或塔)所有伞兵.在第一i安装一排 费用是Ri.在第i列安装的费用是Ci. 要安 ...
- POJ - 3308 Paratroopers (最小点权覆盖)
题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...
- POJ - 3308 Paratroopers(最大流)
1.这道题学了个单词,product 还有 乘积 的意思.. 题意就是在一个 m*n的矩阵中,放入L个敌军的伞兵,而我军要在伞兵落地的瞬间将其消灭.现在我军用一种激光枪组建一个防御系统,这种枪可以安装 ...
- POJ 3308 Paratroopers(最大流最小割の最小点权覆盖)
Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ...
- POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ...
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...
- Paratroopers(最小割模型)
http://poj.org/problem?id=3308 题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这 ...
- poj 3084(最小割)
题目链接:http://poj.org/problem?id=3084 思路:题目的意思是不让入侵者进入保护的房间,至少需要锁几道门.网络流建模:设一个超级源点,源点与有入侵者的房间相连,边容量为in ...
- poj 1815(最小割、割集)
题目链接:http://poj.org/problem?id=1815 思路:题目要求是剔除多少个点,可以将其转化为剔除多少条边,因此需要拆点,将点i拆成i,i+n,便容量为1,表示每个人起的传递作用 ...
随机推荐
- SSRS中加入书签功能及数据集窗口
SSRS在使用过程中,是比较好用的,但如果报表过长,则会比较难看到想看的内容,在SSRS中有书签功能,可以将报表直接直接跳转至书签位置,这样用户可以比较精准的定位到关注位置.使用一个文本框或是图片,再 ...
- PHP基础2
一.函数赋值问题 function add($num1,$num2=5){ echo $num1+$num2; } add(5,19); 二.global 全局变量 把变量加入到全局变量数组中 ...
- <你不知道的JavaScript>读书笔记
近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...
- 12天学好C语言——记录我的C语言学习之路(Day 6)
12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n; scanf("%d,& ...
- Windows下lex 与 yacc的使用
Windows下lex 与 yacc的使用 首先 下载下载flex和bison.网址是http://pan.baidu.com/s/1dDlfiW5 选择下载就好了,下载后解压到你电脑中的任一盘中. ...
- JSTL 入门
JSTL--JSP Standard Tag Library--JSP标准标签函式库 当前版本 1.2.5 JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个J ...
- 13_CXF和Spring整合发布服务
[服务端] 第一步:建立一个Web项目 第二步:填充CXF jar包 第三步:创建接口及服务类 [工程截图(对比之前的WebService_CXF_Server00)] [applicationCon ...
- bzoj2287:[POJ Challenge]消失之物
思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...
- OpenJudge 2774 木材加工
1.链接: http://bailian.openjudge.cn/practice/2774/ 2.题目: 总Time Limit: 1000ms Memory Limit: 65536kB Des ...
- HTML5 Video与Audio 视频与音频
---- 视频Video对象 - 指定视频播放地址 <video width="320" height="240" controls="cont ...