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 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...
随机推荐
- V1-Team Scrum Meeting 博客汇总
V1-Team Scrum Meeting 博客汇总 计划文档 功能规格说明书 技术规格说明书 项目分解 贡献分配规则 一.Alpha阶段 第一次 Scrum Meeting 第二次 Scrum Me ...
- maven 引入本地 jar
$ 参考1 : https://www.cnblogs.com/lixuwu/p/5855031.html ! 注: 参考1中的第二种方法,作者并未实际尝试,我尝试了,虽然在eclipse 中编译不报 ...
- Python+Selenium操作select下拉框
首先需要倒入Select模块: from selenium.webdriver.support.select import Select 常用方法: 通过索引定位:select_by_index() ...
- llinux 目录结构 及Linux文件分享
llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...
- Hadoop Ecosytem
There are a lot of Hadoop related projects which are open sourced and widely used by many componies. ...
- android应用签名详解
1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包: 2.选择需要打包的android项目工程: 3.如果已有私钥文件,选择私钥文件 输入密码,如果没有私钥文件见 第 ...
- 存储型xss调研
概念 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行. 常见的xss攻击方 ...
- D3(v5) in TypeScript 坐标轴之 饼状图生成
饼状图生成时依旧遇到了类型问题,记录如下: import * as d3 from 'd3'; import * as React from 'react'; class TestGraph exte ...
- 给string添加新的函数
var str = "abcdefg";String.prototype.constr = function(){ return this.split('').join('-'); ...
- Ajax的XMLHttpRequest对象
编写一个例子:从服务器取回一个Hello Ajax字符串. HTML: <input type="button" value="ajax提交" oncli ...