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,表示每个人起的传递作用 ...
随机推荐
- [Android学习笔记]View的draw过程学习
View从创建到显示到屏幕需要经历几个过程: measure -> layout -> draw measure过程:计算view所占屏幕大小layout过程:设置view在屏幕的位置dr ...
- [Android学习笔记]startActivityForResult和onActivityResult的使用
发开过程中,免不了多个页面之间相互交互通信. Android中使用startActivityForResult方法和onActivityResult配合完成任务 startActivityForRes ...
- 解决CentOS无法显示中文字体 | 系统运维 | Web2.0
解决CentOS无法显示中文字体 | 系统运维 | Web2.0 About Me 博客园 devops 前端 张家港水蜜桃 傍晚好! 2013年09月12日 17:56:08 ...
- Visual Leak Detector(vld)无法显示内存泄露文件名称与行号
使用VLD測有没内存泄露的时候,出现(File and line number not available): (Function name unavailable) 查看VS控制台,发现 已载入&q ...
- POJ--3268--Silver Cow Party【SPFA+邻接表】
题意:一些牛要去某一点參加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少须要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其它各个点的最短路径.从牛的家中走到聚会地点,能够把 ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- HDU 4916 树分治
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 自动更改IP地址反爬虫封锁,支持多线程(转)
8年多爬虫经验的人告诉你,国内ADSL是王道,多申请些线路,分布在多个不同的电信机房,能跨省跨市更好,我这里写好的断线重拨组件,你可以直接使用. ADSL拨号上网使用动态IP地址,每一次拨号得到的IP ...
- COLORREF和COLOR和RGB的总结
一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...
- Linux 文件系统(二)---运行过程及结构间的关系
(内核2.4.37) 一.首先.看看磁盘.超级块,inode节点在物理上总体的分布情况: (图示来自:www.daoluan.net) 对于一个分区,相应一个文件系统,一个文件系统事实上本质上还是磁盘 ...