1. 搬运工

    ★ 输入文件:worker.in 输出文件:worker.out 简单对比

    时间限制:1 s 内存限制:256 MB

    【题目描述】

    小涵向小宇推荐了一款小游戏。

    游戏是这样的,在一个n*n的地图中,有若干个格子上有障碍物。你需要雇佣搬运工,将这些障碍物全部清除。不过每次操作你只能让搬运工将某一行或者某一列的障碍物全部清除。如果你让搬运工清除第i行障碍物,需要付出ai元;如果你让搬运工清除第j列障碍物,需要付出bj元。

    小涵告诉小宇,必须用尽可能少的次数消除这些障碍物。若有多种方案,则必须花费尽量少的费用。结果小宇想了很久仍然没有闯过第一关,只好向你求助了。

    【输入格式】

    第1行,一个正整数n。

    第2~n+1行,每行n个字符。第i+1行的第j个字符表示地图的坐标(i, j)的格子(左上角为起点(1, 1))。’*’表示障碍,’.’表示空格。

    第n+2行,n个正整数,第i个数表示清除地图第i行的费用。

    第n+3行,n个正整数,第i个数表示清除地图第i列的费用。

    【输出格式】

    输出2行。第1行是最少次数,第2行是在最少次数的前提下费用的最小值。

    【样例输入】

    3



    .*.

    **.

    10 5 17

    1 8 4

    【样例输出】

    2

    9

    【提示】

    30%的数据满足对于任意i和j(1 <= i, j <= n),有ai = bj。

    100%的数据满足1 <= n <= 200,0 <= ai, bj <= 100.

    [样例说明]一共有三个障碍物,坐标分别是(2, 2), (3, 1), (3, 2)。消除第1列和第2列是最优方案。

    【来源】

    HZOI
/*
网络流渣渣表示题解很神.
二分图的两边分别是行和列.
二分图的两边连障碍.
两侧有一侧消去这个障碍就消去了.
so 就转换成了最小点覆盖.
最小点覆盖:选取最少的点数,使这些点和所有的边都有关联(把所有的边的覆盖).
最小点覆盖数=最大匹配数=最大流.
这题还要求一个最小点覆盖下的最小花费.
我们把S到行的流量由1改为inf+a[i].
把列到T的流量由1改为inf+b[i].
于是我们就在不影响答案的情况下
同时算出了最大匹配和最小花费.
ansc=ans/inf,ansf=ans%inf;
*/
#include<iostream>
#include<cstdio>
#include<queue>
#define MAXN 410
#define INF 1e9
const int inf=1e6;
using namespace std;
int n,m,S,T,ans,cut=1,dis[MAXN],a[MAXN],b[MAXN],head[MAXN],ansf,ansc;
char g[MAXN][MAXN];
queue<int>q;
struct data{int u,v,next,c;}e[MAXN*MAXN*6];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int u,int v,int c)
{
e[++cut].u=u;e[cut].v=v;e[cut].c=c;e[cut].next=head[u];head[u]=cut;
e[++cut].u=v;e[cut].v=u;e[cut].c=0;e[cut].next=head[v];head[v]=cut;
}
bool bfs()
{
for(int i=S;i<=T;i++) dis[i]=-1;dis[S]=0;
q.push(S);
while(!q.empty())
{
int u=q.front();q.pop();b[u]=0;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(dis[v]==-1&&e[i].c)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return dis[T]!=-1;
}
int dfs(int u,int y)
{
if(u==T) return y;
int rest=0;
for(int i=head[u];i&&rest<y;i=e[i].next)
{
int v=e[i].v;
if(dis[v]==dis[u]+1&&e[i].c)
{
int x=dfs(v,min(y-rest,e[i].c));
e[i].c-=x;
e[i^1].c+=x;
rest+=x;
}
}
if(!rest) dis[u]=-1;
return rest;
}
void dinic()
{
while(bfs()) ans+=dfs(S,INF);
ansc=ans/inf,ansf=ans%inf;
}
int main()
{
freopen("worker.in","r",stdin);
freopen("worker.out","w",stdout);
int x;
n=read();S=0,T=2*n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g[i][j];
for(int i=1;i<=n;i++)
{
a[i]=read();
add(S,i,inf+a[i]);
}
for(int i=1;i<=n;i++)
{
b[i]=read();
add(i+n,T,inf+b[i]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(g[i][j]=='*') add(i,j+n,INF);
}
dinic();
printf("%d\n%d",ansc,ansf);
return 0;
}

Cogs 1632. 搬运工(二分图最小点覆盖)的更多相关文章

  1. POJ2226 Muddy Fields(二分图最小点覆盖集)

    题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...

  2. POJ1325 Machine Schedule(二分图最小点覆盖集)

    最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边. 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点: 每个任务就 ...

  3. hihoCoder #1127:二分图最小点覆盖和最大独立集

    题目大意:求二分图最小点覆盖和最大独立集. 题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配:任意两个点之间都没有边相连的最大点集称 ...

  4. [POJ] 2226 Muddy Fields(二分图最小点覆盖)

    题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...

  5. 二分图 最小点覆盖 poj 3041

    题目链接:Asteroids - POJ 3041 - Virtual Judge  https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...

  6. HihoCoder1127 二分图三·二分图最小点覆盖和最大独立集

    二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说 ...

  7. 四川第七届 D Vertex Cover(二分图最小点覆盖,二分匹配模板)

    Vertex Cover frog has a graph with nn vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and mm edges (v(a1), ...

  8. hihoCoder #1127 : 二分图二·二分图最小点覆盖和最大独立集

    #1127 : 二分图二·二分图最小点覆盖和最大独立集 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上次安排完相亲 ...

  9. Asteroids POJ - 3041 二分图最小点覆盖

       Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...

随机推荐

  1. 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树

    原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...

  2. JZOJ5833 永恒

    题目大意 给你一个树,每个节点上有有一个部落,以及部落的人数,要你求出每个节点的子树里面人数最多的部落是哪一个(人数相同部落编号最小的). 思路 全网第一篇分治题解 考虑树的dfs序,然后分治处理,每 ...

  3. RSA非对称 私钥加密

    RSA生成公钥和私钥对 /// <summary> /// RSA生成公钥和私钥 /// </summary> /// <returns></returns& ...

  4. 2019 梦网科技java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.梦网科技等公司offer,岗位是Java后端开发,因为发展原因最终选择去了梦网科技,入职一年时间了,也成为了面 ...

  5. 小米手机安装Google框架

    方法一 打开应用商店,搜索谷歌安装器下载即可. 方法二 搜索Gmail.Google+.Youtube等软件跳到豌豆荚,自动下载Google框架.

  6. k8s--yml文件

  7. 五 查询数据SELECT   一、单表查询

    一 单表查询的语法 二 关键字的执行优先级 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 ...

  8. 华为 mate30 安装谷歌助手

    最近入手了 华为 mate30 pro, 作为一个8年的老果粉,在使用2天 mate30p 之后,给了耳目一新的感觉,不得不说这款手机真的很强大,各种优点我也不多说了,可以看网上各种专业的测评 但是手 ...

  9. 反序列化之PHP原生类的利用

    目录 基础知识 __call SoapClient __toString Error Exception 实例化任意类 正文 文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到 ...

  10. Yii2通过curl调用json-rpc接口

    Yii2可以通过json-rpc为前端提供接口数据,通常情况睛会使用异步的形式调用接口,有时也会使用curl调用接口数据. 一.异步调用json-rpc接口 $.ajax({ type: 'POST' ...