http://poj.org/problem?id=3308

题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这一整行或整列的空降兵,给出每一行和每一列安装枪支的花费,总的花费等于所有安装枪支的行和列的花费的乘积。求出最小的总的花费。

思路:(1)最小割:对于图中的两个点(一般为源点和汇点)来说,如果把图中的一些边去掉,如果它们之间无法连通的话,则这些边组成的集合就叫为割了。如果这些边有权值,最小割就是指权值之和最小的一个割。(2)对任意一个只有一个源点和一个汇点的图来说,从源点到汇点的最大流等于最小割,可以用Dinic算法求。由于总的花费等于各花费的乘积,取对数后就能变成和的形式了.

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
const int N=;
const double eps=1e-;
const int INF=<<; struct node
{
int v,u,next;
double w;
} edge[N*];
int head[N],d[N];
int cnt,S,T;
void init()
{
memset(head,-,sizeof(head));
cnt = ;
}
void add(int u,int v,double w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u]=cnt++;
edge[cnt].u = v;
edge[cnt].v = u;
edge[cnt].w = ;
edge[cnt].next = head[v];
head[v]=cnt++;
}
int bfs()
{
queue<int>q;
q.push(S);
memset(d,-,sizeof(d));
d[S] = ;
while(!q.empty())
{
int t = q.front();
q.pop();
for (int j = head[t]; j!=-; j=edge[j].next)
{
int v = edge[j].v;
if (d[v]==-&&edge[j].w>eps)
{
d[v] = d[t]+;
q.push(v);
}
}
}
if (d[T]>)
return ;
return ;
}
double dinic(int t,double sum)
{ if(t==T)
return sum; for (int i = head[t]; i!=-; i=edge[i].next)
{
double a;
int v = edge[i].v;
double w = edge[i].w;
if (d[v]==d[t]+&&w>eps&&(a=dinic(v,min(sum,w))))
{ edge[i].w-=a;
edge[i^].w+=a;
return a;
}
}
return ;
}
int main()
{
int t,m,n,l;
int u,v;
double val;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d%d",&m,&n,&l);
S = ;
T=n+m+;
for (int i = ; i <= m; i++)
{
scanf("%lf",&val);
add(S,i,log(val));
}
for (int i = ; i <= n; i++)
{
scanf("%lf",&val);
add(m+i,T,log(val));
}
while(l--)
{
scanf("%d%d",&u,&v);
add(u,v+m,INF);
}
double ans = ;
while(bfs())
{
double ss = dinic(S,INF);
if(ss>eps)
ans+=ss;
else break; }
printf("%.4f\n",exp(ans));
}
return ;
}

最新文章

  1. scope.$apply是干嘛的
  2. 怎样解决Myeclipse中运行jsp乱码问题,亲测有效(虽然是个小问题但是为了大家不被网络上的一些乱七八糟的回答坑)不是改什么windows-propories-...............
  3. Linux C相关基础
  4. tcp选项TCP_DEFER_ACCEPT
  5. Noip模拟考第三题——饥饿游戏
  6. [MethodImpl(MethodImplOptions.Synchronized)]
  7. Ignatius and the Princess III --undo
  8. GLFW库文件配置
  9. Atitit。团队建设--管理最佳实践--如何留住关键人才,防止人才外流 ??
  10. Java读取打印机自定义纸张.
  11. Effective Java 之-----关于延迟初始化
  12. android WebP解析开源库-支持高清无损
  13. SpringMVC 框架系列之组件概述与配置详解
  14. C#: int 与 byte[] 互转
  15. PAT乙级考前总结(三)
  16. bzoj 2427
  17. java数值比较
  18. Windows10 bypassUAC绕过用户账户控制
  19. pascal与其它语言代码书写的不同和pascal的快捷键
  20. JavaEE学习总结(十六)— Servlet

热门文章

  1. ORACLE索引介绍和使用
  2. jQuery图片延迟加载插件jQuery.lazyload 的使用
  3. libevent reference Mannual I
  4. L2-014. 列车调度(带图详解)
  5. maven使用nexus3.3在windows下搭建私服
  6. java中List遍历删除元素-----不能直接 list.remove()
  7. 2.2 convex hull凸包
  8. 【GC分析】Java GC日志查看
  9. VS2017 +NetCore2.2.0+WebApi项目整合SwaggerUI 以及遇到的坑
  10. vector实现