POJ 3308 最少点集覆盖
题意:和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 最少点集覆盖的更多相关文章
- poj 1422 Air Raid 最少路径覆盖
题目链接:http://poj.org/problem?id=1422 Consider a town where all the streets are one-way and each stree ...
- poj3041 Asteroids 匈牙利算法 最小点集覆盖问题=二分图最大匹配
/** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可 ...
- SAM I AM UVA - 11419 最小点集覆盖 要输出具体覆盖的行和列。
/** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一 ...
- POJ - 3308 Paratroopers(最大流)
1.这道题学了个单词,product 还有 乘积 的意思.. 题意就是在一个 m*n的矩阵中,放入L个敌军的伞兵,而我军要在伞兵落地的瞬间将其消灭.现在我军用一种激光枪组建一个防御系统,这种枪可以安装 ...
- 最小点集覆盖/HDU2119
题目连接 先试一下题/?/ 最小点集覆盖=最大匹配 /*根据i.j建图,跑一边最大匹配 */ #include<cstdio> #include<cstring> using ...
- 最小点集覆盖=最大匹配<二分图>/证明
来源 最小点集覆盖==最大匹配. 首先,最小点集覆盖一定>=最大匹配,因为假设最大匹配为n,那么我们就得到了n条互不相邻的边,光覆盖这些边就要用到n个点. 现在我们来思考为什么最小点击覆盖一定& ...
- HDU 6311 最少路径覆盖边集 欧拉路径
Cover Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ...
- poj 3308(最小点权覆盖、最小割)
题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...
随机推荐
- Jmeter4.0----HTTP Cookie管理器(9)
1.说明 在脚本编写的过程中,我们常常会遇到用户登录之后的相关操作,但是又不想去通过脚本先模拟用户登录,再使用cookie值保持登录,做后续的操作的情况下,我们就会用到HTTP Cookie管理. H ...
- SqlSugar ORM框架文档
http://www.codeisbug.com/Doc/8/1141 SqlSugar入门级教程+实例 (.net core下的)https://www.cnblogs.com/rulasann/p ...
- 如何添加网页QQ在线组件
免费开通QQ推广服务 复制代码到你想要展示的位置 粘贴,完成.
- java io 学习笔记(一)
java的IO操作都在java.io包下面,这个包下面有12个接口和而是多各类,类从读写的角度可以分为两种,一种是用于读,一种是用于写:从字符流字节流的角度,也可以分为两种,一种和字符有关,一种和字节 ...
- Problem E: 积木积水 ——————【模拟】
Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...
- Python 函数运行时更新
Python 动态修改(运行时更新) 特性 实现函数运行时动态修改(开发的时候,非线上) 支持协程(tornado等) 兼容 python2, python3 安装 pip install realt ...
- [转]ASP.NET MVC实现POST方式的Redirect
本文转自:http://www.cnblogs.com/ryuasuka/p/3604452.html?utm_source=tuicool 我们知道,在ASP.NET MVC中,要从一个Action ...
- ASP.NET安全[开发ASP.NET MVC应用程序时值得注意的安全问题](转)
概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 XSS跨站脚本攻击 ...
- 转载:.NET Memory Leak: XmlSerializing your way to a Memory Leak
原文地址:http://blogs.msdn.com/b/tess/archive/2006/02/15/532804.aspx I hate to give away the resolution ...
- 设计模式之职责链模式(JAVA实现)
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...