Paratroopers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7267   Accepted: 2194

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 × 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

这道题第一眼还以为是最优匹配,但是可能开枪数大于最大匹配数,所以不能这么解
以花费为两边容量建边,中间原来的边设为inf,那么每一条边都会流过行花费或者列花费的流量限制
值得一提的是乘积应当转化为自然对数加和然后再指数回来,一开始没看到 另 会在减的过程中小于0,所以直接用a==0判断会T或者WA
//996k 16ms
#include <cstdio>
#include <cstring>
#include <queue>
#include <assert.h>
#include <cmath>
using namespace std;
const double inf=1e20;
const double eps=1e-8;
const int maxnum=302;
const int sups=300,supt=301;
double f[maxnum][maxnum];
int e[maxnum][maxnum];
int len[maxnum]; double min(double a1,double b1) {
return a1<b1?a1:b1;
} int m,n,l;//m ri n ci
void input(){
scanf("%d%d%d",&m,&n,&l);
memset(len,0,sizeof(len)); for(int i=0;i<m;i++){
double ttc;
scanf("%lf",&ttc);
f[sups][i]=log(ttc);
f[i][sups]=0;
e[sups][len[sups]++]=i;
e[i][len[i]++]=sups;
}
for(int i=m;i<m+n;i++){
double ttc;
scanf("%lf",&ttc);
f[i][supt]=log(ttc);
f[supt][i]=0;
e[supt][len[supt]++]=i;
e[i][len[i]++]=supt;
}
for(int i=0;i<l;i++){
int tr,tc;
scanf("%d%d",&tr,&tc);tr--;tc=tc-1+m;
f[tr][tc]=inf;
f[tc][tr]=0;
e[tr][len[tr]++]=tc;e[tc][len[tc]++]=tr;
}
} int d[maxnum];
bool vis[maxnum];
bool bfs(){
memset(vis,0,sizeof(vis));
d[supt]=0;
queue<int >que;
que.push(supt);
vis[supt]=true;
while(!que.empty()){
int fr=que.front();que.pop();
for(int i=0;i<len[fr];i++){
int to=e[fr][i];
if(!vis[to]&&fabs(f[to][fr])>eps){
vis[to]=true;
d[to]=d[fr]+1;
que.push(to);
}
}
}
return vis[sups];
} int cur[maxnum];
double dfs(int s,double a){
if(s==supt||a<eps)return a;
double flow=0;
for(int &i=cur[s];i<len[s];i++){
int to=e[s][i];
double sub;
if(d[s]==d[to]+1&&(sub=dfs(to,min(a,f[s][to])))>eps){
f[s][to]-=sub;
f[to][s]+=sub;
flow+=sub;
a-=sub;
if(fabs(a)<eps)break;
}
}
return flow;
}
double maxflow(){
double ans=0.000;
while(bfs()){
memset(cur,0,sizeof(cur));
ans+=dfs(sups,inf);
}
return ans;
} int main(){
int t;
scanf("%d",&t);
while(t--){
input();
double ans=maxflow();
printf("%.4f\n",exp(ans));
}
return 0;
}

  

												

POJ 3308 Paratroopers 最大流,乘积化和 难度:2的更多相关文章

  1. POJ - 3308 Paratroopers(最大流)

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

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

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

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

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

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

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

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

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

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

  7. poj 3308 Paratroopers

    http://poj.org/problem?id=3308 #include <cstdio> #include <cstring> #include <algorit ...

  8. POJ 3308 Paratroopers(最小割EK)

    题目链接 题意 : 有一个n*m的矩阵,L个伞兵可能落在某些点上,这些点的坐标已知,需要在某些位置安上一些枪,然后每个枪可以将一行或者一列的伞兵击毙.把这种枪安装到不同行的行首.或者不同列的列首,费用 ...

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

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

随机推荐

  1. UVa 1471 Defense Lines - 线段树 - 离散化

    题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...

  2. BZOJ 3529 数表(莫比乌斯+树状数组)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3529 题意:有一张n×m的数表,其第i行第j列的数值为能同时整除i和j的所有自然数 ...

  3. Python3基础 str 通过拆分字符串与插入新的内容形成新的字符串

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. 在CentOS Linux系统上,添加新的端口,启用ssh服务

    SSH作为Linux远程连接重要的方式,如何配置安装linux系统的SSH服务,如何开启SSH? SSH是什么? SSH 为 Secure Shell 由 IETF 的网络工作小组(Network W ...

  5. windows10下使用source insight出现"source insight program editor已停止工作"的问题

    一.背景 1.1 OS 版本 windows 10 1.2 source insight版本 source insight 3.50.0034 二.解决方案 删除"我的文档"下面的source ins ...

  6. bootstrap3

    bs是基于html5和css3的, h5和css3是今后的趋势. html5只是说文档的 "标准"是h5, 但是文档的类型仍然是 html. 所以在写文档类型的时候, 就不能要那个 ...

  7. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  8. [bzoj 1774][Usaco2009 Dec]Toll 过路费

    题目描述 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费 ...

  9. UVa 10801 电梯换乘

    https://vjudge.net/problem/UVA-10801 题意:有多个电梯,每个电梯只能到达指定楼层,每个电梯有速度,如果中途换乘电梯,需要额外加60s,求从0层到达k层的最少时间. ...

  10. Ubuntu 18 开机启动慢

    1.通过指令分析 # sudo systemd-analyze blame 39.607s mysql.service 25.194s systemd-journal-flush.service 23 ...