题意:和Uva 11419 类似。

首先最少点集覆盖 = 最大匹配。

我们可以在 S 和行 的边 不是1,有了权值,但是题意要求的是乘积最小,那么可以用 log(a*b) = loga + logb 转换,那么权值就是logr ,logc;

最大匹配 = 最大流(最大流一定经过最小割,最小割=最大流)。那么题目就转换为求最大流了。

但是,这个题目很流氓,vector的邻接表超时,数组模拟的G++ WA,C++ AC.

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath> using namespace std; /*
const double inf = 1000000.0;
const int maxn = 100;
int dblcmp(double d) {
if(fabs(d)<1e-5)
return 1;
return 0;
} struct Edge {
int from,to;
double cap,flow;
}; struct Dinic
{
int n,m,s,t;
vector<Edge> edge;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn]; void init()
{
for(int i=0;i<maxn;i++)
G[i].clear();
edge.clear();
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
memset(cur,0,sizeof(cur));
} void AddEdge (int from,int to,double cap)
{
edge.push_back((Edge){from,to,cap,0});
edge.push_back((Edge){to,from,0,0});
m = edge.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
} bool BFS()
{
memset(vis,0,sizeof(vis));
queue<int> Q;
Q.push(s);
d[s] = 0;
vis[s] = 1;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
for(int i=0; i<G[x].size(); i++)
{
Edge & e = edge[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow)
{
vis[e.to] = 1;
d[e.to] = d[x] + 1;
Q.push(e.to);
}
}
}
return vis[t];
} double DFS(int x,double a)
{
if(x==t||dblcmp(a)) return a;
double flow = 0,f;
for(int & i = cur[x]; i<G[x].size(); i++)
{
Edge & e = edge[G[x][i]];
if(d[x] + 1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)
{
e.flow +=f;
edge[G[x][i]^1].flow -=f;
flow +=f;
a-=f;
if(dblcmp(a)) break;
}
}
return flow;
} double Maxflow (int s,int t) {
this->s = s;this->t = t;
double flow = 0;
while(BFS()) {
memset(cur,0,sizeof(cur));
flow+=DFS(s,inf);
}
return flow;
} }sol;
*/ const int N = ;
const double inf = 1000000.0; struct Edge{
int s,e,next;
double v;
}edge[*N]; int n,e_num,head[N],d[N],sp,tp; void AddEdge(int a,int b,double c){
edge[e_num].s=a; edge[e_num].e=b; edge[e_num].v=c;
edge[e_num].next=head[a]; head[a]=e_num++; edge[e_num].s=b; edge[e_num].e=a; edge[e_num].v=0.0;
edge[e_num].next=head[b]; head[b]=e_num++;
} int bfs(){
queue <int> q;
memset(d,-,sizeof(d));
d[sp]=;
q.push(sp);
while(!q.empty()){
int cur=q.front();
q.pop();
for(int i=head[cur];i!=-;i=edge[i].next){
int u=edge[i].e;
if(d[u]==- && edge[i].v>){//没有标记,且可行流大于0
d[u]=d[cur]+;
q.push(u);
}
}
}
return d[tp] != -;//汇点是否成功标号,也就是说是否找到增广路
} double dfs(int a,double b){//a为起点
double r=;
if(a==tp)return b;
for(int i=head[a];i!=- && r<b;i=edge[i].next){
int u=edge[i].e;
if(edge[i].v> && d[u]==d[a]+){
double x=min(edge[i].v,b-r);
x=dfs(u,x);
r+=x;
edge[i].v-=x;
edge[i^].v+=x;
}
}
if(!r)d[a]=-;
return r;
} double dinic(int sp,int tp){
double total=0.0,t;
while(bfs()){
while(t=dfs(sp,inf))
total+=t;
}
return total;
} int main()
{
int t;
scanf("%d",&t);
int i,m,l,a,b;
double row[N],col[N];
while(t--) { /*
//sol.init();
int m,n,l;
scanf("%d%d%d",&m,&n,&l);
sp = 0,tp=m+n+1;
e_num=0;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++) {
double r;
scanf("%lf",&r);
//sol.AddEdge(s,i,log(r));
AddEdge(sp,i,log(r));
} for(int i=1;i<=n;i++) {
double c;
scanf("%lf",&c);
//sol.AddEdge(i+m,t,log(c));
AddEdge(i+m,tp,log(c));
} for(int i=0;i<l;i++) {
int u,v;
scanf("%d%d",&u,&v);
v+=m;
//sol.AddEdge(u,v,inf);
AddEdge(u,v,inf);
} //double ans = sol.Maxflow(s,t);
double ans = dinic(sp,tp);
printf("%.4lf\n",exp(ans));
*/ scanf("%d%d%d",&n,&m,&l);
for(i=;i<=n;i++)
scanf("%lf",&row[i]);
for(i=;i<=m;i++)
scanf("%lf",&col[i]); e_num=;
memset(head,-,sizeof(head));
sp=; tp=n+m+;
for(i=;i<=n;i++)
AddEdge(sp,i,log(row[i]));
for(i=;i<=m;i++)
AddEdge(n+i,tp,log(col[i]));
for(i=;i<=l;i++){
scanf("%d%d",&a,&b);
AddEdge(a,n+b,inf);
} printf("%.4lf\n",exp(dinic(sp,tp))); } return ;
}

POJ 3308 最少点集覆盖的更多相关文章

  1. poj 1422 Air Raid 最少路径覆盖

    题目链接:http://poj.org/problem?id=1422 Consider a town where all the streets are one-way and each stree ...

  2. poj3041 Asteroids 匈牙利算法 最小点集覆盖问题=二分图最大匹配

    /** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可 ...

  3. SAM I AM UVA - 11419 最小点集覆盖 要输出具体覆盖的行和列。

    /** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一 ...

  4. POJ - 3308 Paratroopers(最大流)

    1.这道题学了个单词,product 还有 乘积 的意思.. 题意就是在一个 m*n的矩阵中,放入L个敌军的伞兵,而我军要在伞兵落地的瞬间将其消灭.现在我军用一种激光枪组建一个防御系统,这种枪可以安装 ...

  5. 最小点集覆盖/HDU2119

    题目连接 先试一下题/?/ 最小点集覆盖=最大匹配 /*根据i.j建图,跑一边最大匹配 */ #include<cstdio> #include<cstring> using ...

  6. 最小点集覆盖=最大匹配<二分图>/证明

    来源 最小点集覆盖==最大匹配. 首先,最小点集覆盖一定>=最大匹配,因为假设最大匹配为n,那么我们就得到了n条互不相邻的边,光覆盖这些边就要用到n个点. 现在我们来思考为什么最小点击覆盖一定& ...

  7. HDU 6311 最少路径覆盖边集 欧拉路径

    Cover Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)

    http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ...

  9. poj 3308(最小点权覆盖、最小割)

    题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...

随机推荐

  1. 牛客网Java刷题知识点之equals和hashcode()

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  2. jar包、jdk版本、兼容性

    对jar包.jdk版本,以及不同jdk版本的jar包的兼容性有一些疑问,搜集一些资料于此 查看jar包的jdk版本 查看.jar包中的META-INF\MANIFEST.MF Build-Jdk: 1 ...

  3. linux_api之高级IO

    本篇索引: 1.引言 2.非阻塞IO 3.记录锁(文件锁) 4.io多路复用(I/O multiplexing ) 5.异步IO 6.存储映射IO 1.引言 我们第三篇学习了对IO的open.read ...

  4. angular2 遇到的问题汇总

    angular2 学习资源集锦:https://github.com/timjacobi/angular2-education 在学习angular开发项目过程遇到的问题: 1. 不同componen ...

  5. 【mysql】mysql数据库安装

    今天一直在测功能,整理用例,所以没有去调项目,想到之前有小伙伴求助数据库安装,还远程了一番,所以,就整理一下,数据库在测试工作中还是挺重要的,不能本地测试改个数据都去找开发小哥哥吧,是不是不太好呢,妹 ...

  6. 深入理解JavaScript系列(15):函数(Functions)

    介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...

  7. 深入理解JavaScript系列(12):变量对象(Variable Object)

    介绍 JavaScript编程的时候总避免不了声明函数和变量,以成功构建我们的系统,但是解释器是如何并且在什么地方去查找这些函数和变量呢?我们引用这些对象的时候究竟发生了什么? 原始发布:Dmitry ...

  8. sql 创建用户脚本

    USE master go  CREATE LOGIN jiazhuang --用户名 WITH PASSWORD = 'sa', --密码 DEFAULT_DATABASE = JiaZhuan, ...

  9. node.js发邮件

    在node上使用第三方类库(nodemailer)发邮件是一件很esay的事情:) app.js   以QQ邮箱为例 var nodemailer = require('nodemailer'); v ...

  10. sql查询时,根据特定的条件给表的某一个字段赋值

    先讲一下需要这个需求的情景: 这是一个招聘求职项目遇到的一个问题.个人A向公司B的职位投递简历后,公司B会收到个人A的简历;但是A投递后把简历删除,公司收到的简历信箱 还有这个简历,但却不能看了. 原 ...