POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
http://poj.org/problem?id=3308
r*c的地图
每一个大炮可以消灭一行一列的敌人
安装消灭第i行的大炮花费是ri
安装消灭第j行的大炮花费是ci
已知敌人坐标,同时消灭所有敌人,问最小花费
花费为所有大炮消费的乘积
乘转加:log(a*b*c)=log(a)+log(b)+log(c)
经典的最小点权覆盖
源点向行连,列向汇点连
第i行j列有敌人,点i向点j连inf边
最小点权覆盖=最小割
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const double inf=;
const double eps=1e-; #define N 201
#define M 701 int src,decc; int tot;
int front[N],to[M<<],nxt[M<<];
double val[M<<]; int cur[N],lev[N]; queue<int>q; void add(int u,int v,double cap)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=cap;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=;
} bool bfs()
{
for(int i=;i<=decc;++i) lev[i]=-,cur[i]=front[i];
while(!q.empty()) q.pop();
lev[src]=;
q.push(src);
int now,t;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=front[now];i;i=nxt[i])
{
t=to[i];
if(lev[t]==- && val[i]>eps)
{
lev[t]=lev[now]+;
if(t==decc) return true;
q.push(t);
}
}
}
return false;
} double dinic(int now,double flow)
{
if(now==decc) return flow;
double rest=,delta;
int t;
for(int &i=cur[now];i;i=nxt[i])
{
t=to[i];
if(lev[t]>lev[now] && val[i]>eps)
{
delta=dinic(t,min(flow-rest,val[i]));
if(delta>eps)
{
rest+=delta;
val[i]-=delta; val[i^]+=delta;
if(fabs(rest-flow)<eps) break;
}
}
}
if(fabs(rest-flow)>eps) lev[now]=-;
return rest;
} int main()
{
int T;
scanf("%d",&T);
int n,m,k;
double x,ans;
int a,b;
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
decc=n+m+;
tot=;
memset(front,,sizeof(front));
for(int i=;i<=n;++i)
{
scanf("%lf",&x);
add(src,i,log(x));
}
for(int i=;i<=m;++i)
{
scanf("%lf",&x);
add(i+n,decc,log(x));
}
for(int i=;i<=k;++i)
{
scanf("%d%d",&a,&b);
add(a,b+n,inf);
}
ans=;
while(bfs()) ans+=dinic(src,inf);
printf("%.4lf\n",exp(ans));
}
}
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 8903 | Accepted: 2679 |
Description
It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the Mars. Recently, the commanders of the Earth are informed by their spies that the invaders of Mars want to land some paratroopers in the m × n grid yard of one their main weapon factories in order to destroy it. In addition, the spies informed them the row and column of the places in the yard in which each paratrooper will land. Since the paratroopers are very strong and well-organized, even one of them, if survived, can complete the mission and destroy the whole factory. As a result, the defense force of the Earth must kill all of them simultaneously after their landing.
In order to accomplish this task, the defense force wants to utilize some of their most hi-tech laser guns. They can install a gun on a row (resp. column) and by firing this gun all paratroopers landed in this row (resp. column) will die. The cost of installing a gun in the ith row (resp. column) of the grid yard is ri (resp. ci ) and the total cost of constructing a system firing all guns simultaneously is equal to the product of their costs. Now, your team as a high rank defense group must select the guns that can kill all paratroopers and yield minimum total cost of constructing the firing system.
Input
Input begins with a number T showing the number of test cases and then, T test cases follow. Each test case begins with a line containing three integers 1 ≤ m ≤ 50 , 1 ≤ n ≤ 50 and 1 ≤ l ≤ 500 showing the number of rows and columns of the yard and the number of paratroopers respectively. After that, a line with m positive real numbers greater or equal to 1.0 comes where the ith number is ri and then, a line with n positive real numbers greater or equal to 1.0 comes where the ith number is ci. Finally, l lines come each containing the row and column of a paratrooper.
Output
For each test case, your program must output the minimum total cost of constructing the firing system rounded to four digits after the fraction point.
Sample Input
1
4 4 5
2.0 7.0 5.0 2.0
1.5 2.0 2.0 8.0
1 1
2 2
3 3
4 4
1 4
Sample Output
16.0000
POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)的更多相关文章
- POJ - 3308 Paratroopers (最小点权覆盖)
题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...
- poj3308 Paratroopers --- 最小点权覆盖->最小割
题目是一个非常明显的二分图带权匹配模型, 加入源点到nx建边,ny到汇点建边,(nx.ny)=inf建边.求最小割既得最小点权覆盖. 在本题中因为求的是乘积,所以先所有取log转换为加法,最后再乘方回 ...
- 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 (对数转换+最小点权覆盖)
题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...
- 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(二分图最小点权覆盖)
Paratroopers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8954 Accepted: 2702 Desc ...
- poj 3308(最小点权覆盖、最小割)
题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...
- POJ3308 Paratroopers(最小割/二分图最小点权覆盖)
把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...
随机推荐
- php----函数大全
字符串函数 数组函数 数学函数
- 6/5 sprint2 看板和燃尽图的更新
- 解决将easyui里的combobox里的输入框下拉列表变为空值
jQuery easyui官网上有一个方法是 :clear方法,这个方法说是能清除数据,但我测试了,结果它确实清楚了(但他清除的只是输入框显示的数据,没有清除所有的数据),在这里巧妙的用 它加载数据的 ...
- Majority Number III
Given an array of integers and a number k, the majority number is the number that occursmore than 1/ ...
- Python学习笔记day01--Python基础
1 python的应用 Python崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等 ...
- mybatis的setting
在mybaits中,setting的的配置参数如下(如果不在配置文件中配置将使用默认值): 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关 tr ...
- springmvc+mybatis 处理图片(二):显示图片
数据库及配置文件等参考:springmvc+mybatis 处理图片(一):上传图片思路:把图片二进制信息写入到HttpServletResponse 的outputStream输出流中来显示图片.一 ...
- 【BZOJ4774】修路(动态规划,斯坦纳树)
[BZOJ4774]修路(动态规划,斯坦纳树) 题面 BZOJ 题解 先讲怎么求解最小斯坦纳树. 先明白什么是斯坦纳树. 斯坦纳树可以认为是最小生成树的一般情况.最小生成树是把所有给定点都要加入到联通 ...
- USACO Section 1.5 Number Triangles 解题报告
题目 题目描述 现在有一个数字三角形,第一行有一个数字,第二行有两个数字,以此类推...,现在从第一行开始累加,每次在一个节点累加完之后,下一个节点必须是它的左下方的那个节点或者是右下方那个节点,一直 ...
- 洛谷 P1306 斐波那契公约数 解题报告
P1306 斐波那契公约数 题意:求\(Fibonacci\)数列第\(n\)项和第\(m\)项的最大公约数的最后8位. 数据范围:\(1<=n,m<=10^9\) 一些很有趣的性质 引理 ...