poj3308 Paratroopers --- 最小点权覆盖->最小割
题目是一个非常明显的二分图带权匹配模型,
加入源点到nx建边,ny到汇点建边,(nx。ny)=inf建边。求最小割既得最小点权覆盖。
在本题中因为求的是乘积,所以先所有取log转换为加法,最后再乘方回来。
- #include <iostream>
- #include <cstring>
- #include <string>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <map>
- #define inf 0x3f3f3f3f
- #define eps 1e-6
- #define ll __int64
- const int maxn=110;
- using namespace std;
- int n,s,t,level[maxn];
- double c[maxn][maxn];
- bool makelevel()
- {
- memset(level,0,sizeof level);
- level[s]=1;
- int q[maxn];
- int fro=0,iq=0;
- q[iq++]=s;
- int i,v;
- while(fro!=iq)
- {
- v=q[fro++];
- for(i=0;i<=t;i++)
- {
- if(!level[i]&&c[v][i])
- {
- level[i]=level[v]+1;
- q[iq++]=i;
- }
- }
- }
- if(!level[t]) return 0;
- return 1;
- }
- double dfs(int now,double maxf)
- {
- if(now==t) return maxf;
- double ret=0;
- for(int i=0;maxf!=0&&i<=t;i++)
- {
- if(c[now][i]&&level[now]+1==level[i])
- {
- double tmp=dfs(i,min(maxf,c[now][i]));
- c[now][i]-=tmp;
- c[i][now]+=tmp;
- ret+=tmp;
- maxf-=tmp;
- }
- }
- return ret;
- }
- double dinic()
- {
- double ans=0;
- while(makelevel()) ans+=dfs(s,10000000);
- return ans;
- }
- int main()
- {
- int icy,m,l,i,aa,bb;
- double a,b;
- scanf("%d",&icy);
- while(icy--)
- {
- scanf("%d%d%d",&m,&n,&l);
- s=0;t=n+m+1;
- memset(c,0,sizeof c);
- for(i=1;i<=m;i++)
- {
- scanf("%lf",&a);
- c[0][i]=log(a);
- }
- for(i=1;i<=n;i++)
- {
- scanf("%lf",&a);
- c[i+m][t]=log(a);
- }
- for(i=0;i<l;i++)
- {
- scanf("%d%d",&aa,&bb);
- c[aa][bb+m]=10000000;
- }
- printf("%.4lf\n",exp(dinic()));
- }
- return 0;
- }
poj3308 Paratroopers --- 最小点权覆盖->最小割的更多相关文章
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- poj 3308(最小点权覆盖、最小割)
题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...
- poj 2125 Destroying The Graph (最小点权覆盖)
Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS Memory Limit: 65536K ...
- POJ3308 Paratroopers(最小割/二分图最小点权覆盖)
把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...
- poj3308 Paratroopers 最大流 最小点权覆盖
题意:有一个n*m的矩阵,告诉了在每一行或者每一列安装大炮的代价,每一个大炮可以瞬间消灭这一行或者这一列的所有敌人,然后告诉了敌人可能出现的L个坐标位置,问如何安置大炮,使花费最小.如果一个敌人位于第 ...
- POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ...
- 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(二分图最小点权覆盖)
Paratroopers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8954 Accepted: 2702 Desc ...
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...
随机推荐
- MySQL对于有大量重复数据表的处理方法
需要在MySQL的一张innodb引擎的表(tableA)上添加一个唯一索引(idx_col1_u).但是对于每个key(col1)表中已经有大量重复数据.此时,做数据的手工清理,或者SQL处理是非常 ...
- [置顶] MongoDB 分布式操作——分片操作
MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- ps快速删除圆角图片旁白的白色区域方法
简单实用5招的ps快速删除圆角图片旁白的白色区域方法 1.图像-模式-rgb颜色 2.双击背景取消图层锁定 3.用魔棒工具点击要删除的区域 4.delete删除 5.另存为png图片
- JavaScript 高级程序设计(第3版)笔记——chapter7:函数表达式
一.函数表达式的语法形式 匿名函数 var functionName = function(arg0, arg1, arg2) { //函数体 } 二.函数表达式没有函数提升 var a = 1; i ...
- [译]Stairway to Integration Services Level 16 – Flexible Source Locations (多文件导入)
介绍 在本文中我们将利用SSIS参数,变量 以及 Foreach Loop Container 从多个源动态导入数据. 开始前我们先下载一些数据.WeatherData_Dec08_Apr09.zip ...
- Hive环境搭建心得(Ubuntu)
Hive是什么? 基于Hadoop的数据查询工具,可以使用类SQL进行数据查询. Hadoop安装 参考了Hadoop安装 注意到etc/hadoop/hadoop-env.sh里设置JAVA_HOM ...
- js 模板引擎 jade使用语法
Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...
- URAL 1146 Maximum Sum 最大子矩阵和
题目:click here #include <bits/stdc++.h> using namespace std; typedef unsigned long long ll; con ...
- linux c: 静态库和动态库的生成和使用
场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i ...