POJ 3308 Paratroopers 最大流,乘积化和 难度:2
| 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 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 这道题第一眼还以为是最优匹配,但是可能开枪数大于最大匹配数,所以不能这么解
以花费为两边容量建边,中间原来的边设为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的更多相关文章
- POJ - 3308 Paratroopers(最大流)
1.这道题学了个单词,product 还有 乘积 的意思.. 题意就是在一个 m*n的矩阵中,放入L个敌军的伞兵,而我军要在伞兵落地的瞬间将其消灭.现在我军用一种激光枪组建一个防御系统,这种枪可以安装 ...
- 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 ...
- POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ...
- POJ - 3308 Paratroopers (最小点权覆盖)
题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...
- 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 (对数转换+最小点权覆盖)
题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...
- poj 3308 Paratroopers
http://poj.org/problem?id=3308 #include <cstdio> #include <cstring> #include <algorit ...
- POJ 3308 Paratroopers(最小割EK)
题目链接 题意 : 有一个n*m的矩阵,L个伞兵可能落在某些点上,这些点的坐标已知,需要在某些位置安上一些枪,然后每个枪可以将一行或者一列的伞兵击毙.把这种枪安装到不同行的行首.或者不同列的列首,费用 ...
- zoj 2874 & poj 3308 Paratroopers (最小割)
意甲冠军: 一m*n该网络的规模格.详细地点称为伞兵着陆(行和列). 现在,在一排(或列) 安装激光枪,激光枪可以杀死线(或塔)所有伞兵.在第一i安装一排 费用是Ri.在第i列安装的费用是Ci. 要安 ...
随机推荐
- noip 2013 提高组 Day2 部分题解
积木大赛: 之前没有仔细地想,然后就直接暴力一点(骗点分),去扫每一高度,连到一起的个数,于是2组超时 先把暴力程序贴上来(可以当对拍机) #include<iostream> #incl ...
- VC++ 进度条更新方案
在实际开发中,如果有耗时操作,一般会在工作线程处理数据,然后处理完成后把时间传递到UI线程进行显示,切记不要在工作线程对UI进行操作. 场景: 1. 很多程序需要根据处理业务的进度来更新进度条,进度条 ...
- HttpClient4.5简单使用
一.HttpClient简介 HttpClient是一个客户端的HTTP通信实现库,它不是一个浏览器.关于HTTP协议,可以搜索相关的资料.它设计的目的是发送与接收HTTP报文.它不会执行嵌入在页面中 ...
- SQLSERVER中order by ,group by ,having where 的先后顺序
SELECT [Name] FROM [LinqToSql].[dbo].[Student] where name='***' group by name having (name='* ...
- LOJ#2170. 「POI2011」木棍 Sticks
题目链接 题意就是给你一堆线段,然后线段有长度和颜色,让你选三条组成一个三角形,这三条线段颜色不能一样 题解: 做法:贪心 首先按照长度给这些线段排序一遍 然后贪心的去选,对于已经选出来同种颜色的,就 ...
- 51nod 1307 绳子与重物(并查集水了一发)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 思路: 可以直接二分答案,然后dfs. 因为标签是并查集, ...
- python学习站点
1.python 外部扩展网址 http://www.lfd.uci.edu/~gohlke/pythonlibs Python Extension Packages 2.web2py学习 http: ...
- [转]VS“当前上下文中不存在名称“ViewBag”解决方法
原文链接:<VS"当前上下文中不存在名称"ViewBag",当前上下文不存在名称"model""-已解决> 自己的项目出现了错误 ...
- Java中引用的详解
Java中没有指针,到处都是引用(除了基本类型).所以,当然,你肯定知道java的引用,并用了很久,但是是不是对此了解地比较全面?而这些引用有什么作用,且有什么不同呢?Java中有个java.lang ...
- Python写ROS 订阅与发布程序
1. 编写talker代码 vim ..../src/talker.py #!/usr/bin/env python # license removed for brevity import rosp ...