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 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...
随机推荐
- ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.
在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[ ]]>将小于号包裹,如此不会被xml解析器解析. ...
- PMP 变更的流程
变更的流程: 内部变更: (团队成员提出)团队成员提出的变更,原则上拒绝,如果对客户和自己方都有好处不能拒绝1.内部变更 先分析影响 >> 2. 再提出变更请求 >> 3.变更 ...
- TCP/IP协议分为哪四层,具体作用是什么。
TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.这4层分别为: 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP).文件传输协议(FTP).网络远 ...
- 《The Python Tutorial》——Errors and Exceptions 阅读笔记
Errors and Exceptions 官方文档:https://docs.python.org/3.5/tutorial/errors.html python中所有的异常都继承自BaseExce ...
- temp脚本
!/bin/bash source ${HOME_DIR}/script/ideploy_dm.inc source ${HOME_DIR}/script/comm_lib home_dir=$(cd ...
- Oracle 过程中变量赋值
create or replace function get_sal1(id employees.employee_id%type) return number is sal employees.sa ...
- e.target和e.event和event.srcElement
e.target 是目标对象,e.event是目标所发生的事件,event.srcElement捕获当前事件作用的对象 1. $(function(){ $("li:has(ul)" ...
- 在浏览器中对访问的网页中的cookie添加和修改
做权限相关的东西,使用到了cookie,关于它的安全性,cookie在浏览器中,通过插件是可以对其进行修改的,如下: 1.FireFox 安装Edit This Cookie 插件,之后点击插件图标即 ...
- PHP常用数组操作方法汇总
array_change_key_case -- 返回字符串键名全为小写或大写的数组array_chunk -- 将一个数组分割成多个array_combine -- 创建一个数组,用一个数组的值作为 ...
- TCP/IP、Http、Soap三个基本的通讯协议
看到一个说法,比较通俗易懂: HTTP就是邮局的协议,他们规定了你的信封要怎么写,要贴多少邮票等.... SOAP就是你们之间交流的协议,负责把你所需要表达的意思写在信纸上,同时也负责 ...