zoj 2874 & poj 3308 Paratroopers (最小割)
意甲冠军:
一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 & poj 3308 Paratroopers (最小割)的更多相关文章
- 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 (最小点权覆盖)
题意: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,表示每个人起的传递作用 ...
随机推荐
- robots.txt禁止搜索引擎收录
禁止搜索引擎收录的方法 一.什么是robots.txt文件? 搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信息. 您可以在您的网站中创建一个纯文 ...
- 设备管理 USB ID
发现个USB ID站点,对于做设备管理识别的小伙伴特别实用 http://www.linux-usb.org/usb.ids 附录: # # List of USB ID's # # Maintain ...
- Android开发周报:Android L默认加密用户数据
Android开发周报:Android L默认加密用户数据 新闻 <iCloud前车之鉴,Android L默认开启加密功能>:iCloud 艳照风波再起,第二波女星照片流出,大量女星的裸 ...
- CreateThread、_beginthreadex和AfxBeginThread 的区别
CreateThread._beginthreadex和AfxBeginThread 创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢?参考了一些资料,写得都挺好的,这里做一些摘抄和整 ...
- EF中的事务处理的初步理解
http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...
- 开玩笑Web它servlet(五岁以下儿童)---- 如何解决servlet线程安全问题
servlet默认值是安全线的存在,但说白,servlet安全线实际上是一个多线程线程安全问题.因为servlet它正好是一个多线程的安全问题出现. 每次通过浏览器http同意提交请求,将一个实例se ...
- oracle 之 内存—鞭辟近里(一)
oracle 之 内存—鞭辟近里(一) 今天是2013-07-8日,这几天一直都在寻找一本深入研究oracle内存的书籍,期间一波三折弄的自己神魂颠倒,但是还是被我拿下了,感谢支持我的朋友,这周打算把 ...
- android
在特殊应用的特殊功能,以帮助通信系统的问题
在实际工程中的应用,进入一个特殊的应用后,系统的某个功能不能起作用. 当然,这个通信有非常多办法能够做到.笔者能够想到的至少有例如以下几种 1.利用property熟悉来实现,这种话须要添加一个特殊的 ...
- Java中的statickeyword具体解释
1.statickeyword主要有2个作用: ①为某特定的数据类型或者对象分配单一的存储空间.而与创建对象的个数无关. ②在不创建对象的情况下能够直接通过类名来直接调用方法或者使用类的属性. 2.s ...
- 字符串匹配的KMP算法(转)
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...