POJ 3308
http://poj.org/problem?id=3308
考虑答案不是乘积而是和的做法,
因为对于每一个伞兵我们要么在这行内安装大炮消灭它
要么在这列中安装大炮消灭它,所以容易看出这是一个最小边覆盖集的问题
所以转化成乘积需要用到一个特殊的方法(以前没用过)
\(ans=a_1a_2\cdots a_k\)
\(ans=10^{\lg ans}=10^{\lg a_1a_2\cdots a_k}\)
\(ans=10^{\lg a_1+\lg a_2+\cdots \lg a_k}\)
这样就将乘法转化成加法了
不过还是遇到一个问题不知道如何解决
这个边的流量如果是浮点数如何解决
…………………………………………
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#define N 1000005
#define inf 0x3f3f3f3f
using namespace std;
int read(){
    int s=0;char ch=getchar();
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);s=s*10+ch-'0',ch=getchar());
    return s;
}
struct Edge{
    int to,nxt,cap;
};
int que[N];
int h,qt;
struct Dinic{
    Edge e[N];
    bool vis[N];
    int tot,s,t,n;
    int d[N],cur[N],head[N];
    Dinic(){tot=1;}
    void add(int u,int v,int f){
        e[++tot].to=v;
        e[tot].cap=f;
        e[tot].nxt=head[u];
        head[u]=tot;
        e[++tot].to=u;
        e[tot].cap=0;
        e[tot].nxt=head[v];
        head[v]=tot;
    }
    bool bfs(){
        memset(vis,false,sizeof(vis));
        for(int i=0;i<=n;++i)cur[i]=head[i];
        que[qt=1]=s,h=0;int top,to;d[s]=0;vis[s]=1;
        while(h<qt){
            top=que[++h];
            for(int i=head[top];i;i=e[i].nxt)
                if(!vis[e[i].to]&&e[i].cap){
                    to=e[i].to;que[++qt]=to;
                    vis[to]=true;d[to]=d[top]+1;
                    if(to==t)return true;
                }
        }
        return vis[t];
    }
    int dfs(int x,int fl){
        if(x==t)return fl;
        int flow=0,f,to;
        for(int &i=cur[x];i;i=e[i].nxt){
            to=e[i].to;
            if(d[to]==d[x]+1&&e[i].cap)
            if(f=dfs(to,min(fl,e[i].cap))){
                e[i].cap-=f;fl-=f;
                e[i^1].cap+=f;flow+=f;
                if(fl<=0)break;
            }
        }
        if(fl)d[x]=-1;
        return flow;
    }
    int maxflow(int s,int t){
        this->s=s;this->t=t;
        int ans=0;
        while(bfs())ans+=dfs(s,inf);
        return ans;
    }
};
int co[N];
int st[N];
double Co[N];
double St[N];
int main(){
    Dinic f;
    int n,m,k,s,t,a,b,c;
    scanf("%d%d%d",&n,&m,&k);
    f.n=2+n+m;
    for(int i=1;i<=n;++i){
        cin>>co[i];
        Co[i]=log10(co[i]);
    }
    for(int i=1;i<=n;++i)
        f.add(1,i+1,Co[i]);
    for(int j=1;j<=m;++j)
        f.add(n+m+2,n+1+i);
    for(int i=1;i<=n;++i){
        cin>>st[i];
        St[i]=log10(st[i]);
    }
    for(int i=1;i<=k;++i){
        cin>>a>>b;
        f.add(a,b,inf);
    }
    cout<<f.maxlflow(1,n+m+2);
    return 0;
}
POJ 3308的更多相关文章
- POJ - 3308 Paratroopers(最大流)
		1.这道题学了个单词,product 还有 乘积 的意思.. 题意就是在一个 m*n的矩阵中,放入L个敌军的伞兵,而我军要在伞兵落地的瞬间将其消灭.现在我军用一种激光枪组建一个防御系统,这种枪可以安装 ... 
- poj 3308 Paratroopers
		http://poj.org/problem?id=3308 #include <cstdio> #include <cstring> #include <algorit ... 
- POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
		http://poj.org/problem?id=3308 r*c的地图 每一个大炮可以消灭一行一列的敌人 安装消灭第i行的大炮花费是ri 安装消灭第j行的大炮花费是ci 已知敌人坐标,同时消灭所有 ... 
- poj 3308(最小点权覆盖、最小割)
		题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ... 
- POJ 3308 Paratroopers(最小割EK(邻接表&矩阵))
		Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ... 
- POJ - 3308 Paratroopers (最小点权覆盖)
		题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ... 
- 网络流 poj 3308 最小割
		t个样例 n*m的矩阵 L个伞兵 给出每行每列装激光的花费 伞兵的位置 要求杀死所有伞兵 总费用为这些费用的乘积 求花费最小 建图 源点 -> 行 -> 列 -> 汇点 ... 
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
		题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ... 
- POJ  3308 Paratroopers(最小割EK)
		题目链接 题意 : 有一个n*m的矩阵,L个伞兵可能落在某些点上,这些点的坐标已知,需要在某些位置安上一些枪,然后每个枪可以将一行或者一列的伞兵击毙.把这种枪安装到不同行的行首.或者不同列的列首,费用 ... 
随机推荐
- Unity3D LOD Group
			今天下了一个4.0破解版,然后看到一个Demo Level of Detail 就研究了一下 以前用的是Unity3.5 free版本,没有这个功能,真实泪奔....... As your s ... 
- AOJ.849 分数 (暴力)
			AOJ.849 分数 (暴力) 题意分析 每次枚举分子,然后根据给出的分数值,推算出来分母,然后取分母上下几个数进行进一步计算,看看哪个更接近. 一开始想着直接枚举分子和分母,复杂度爆炸... 代码总 ... 
- 从零开始学Linux系统(四)之Vi/Vim操作指令
			模式切换: 编辑模式 <-- [:]<--命令模式 -->[a.i.o A.I.O]--> 插入模式 编辑模式操作: 设置行号 :set nu :set nonu 复制 ... 
- bzoj2165: 大楼(倍增floyd)
			题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ... 
- Linux用户、用户组权限管理详解 --- 02
			2,用户.用户组管理操作详解: 2.1 adduser 添加用户: adduser [-u uid][-g group][-d home][-s shell] -u:直接给出userID ... 
- Codeforces Round #402 (Div. 2) A B C sort  D二分 (水)
			A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ... 
- hibernate、mybatis、beetsql的学习
			先推荐两篇文章吧: https://my.oschina.net/xiandafu/blog/617542 http://blog.csdn.net/xiandafu/article/details/ ... 
- 页面自适应<meta name="viewport">标签设置
			viewport: 它在页面中设置,是应对手机模式访问网站.网页对屏幕而做的一些设置.通常手机浏览器打开页面后,会把页面放在一个虚拟的“窗 口”–这个比窗口大,也就是你常发现页面可以进行拖动.放大放小 ... 
- LightOJ 1319 - Monkey Tradition CRT除数互质版
			本题亦是非常裸的CRT. CRT的余数方程 那么定义 则 其中 为模mi的逆元. /** @Date : 2016-10-23-15.11 * @Author : Lweleth (SoungEarl ... 
- jQuery拖拽 & 弹出层
			了解更多请查看 官网 和 API iDrag & iDialog 介绍 特点: iDialog.js依赖于jquery编写的简单易用的对话框,同时还可以通过添加css3,改变对话框的展现动画. ... 
