题目链接:https://cn.vjudge.net/contest/281959#problem/E

题目大意:中文题目

具体思路:首先,有矛盾的时候就是两个导弹的运动轨迹会相交的时候,那么我们可以按照这样的思路,在每个导弹不想交的前提下,使得总的消灭数最大。然后我们就可以了按照会相交的方式建图,求出最小割,然后再用总和减去最小割,就能得出最大的消灭量了。

建图的时候,首先横点向竖点连边,权值是inf。每一个炮弹记录他能打到的最大的消灭数,然后对于横着的炮台,从当前的炮台出发到最大的消灭数所在的位置,每一步的权值就是max-当前这个点的权值,最终求的答案的时候,所有炮台的最大值的总和-最小割就是最大消灭数了。

AC代码:

 #include<iostream>
#include<stack>
#include<queue>
#include<iomanip>
#include<stdio.h>
#include<cstring>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
# define ll long long
const int maxn = +;
const int inf = 0x3f3f3f3f;
int prev[maxn];
int head[maxn];
int dx[]= {-,,,};
int dy[]= {,,-,};
int A[][],B[][],w[][];
struct node
{
int to;
int flow;
int nex;
} edge[maxn];
int num,st,ed;
void init()
{
memset(head,-,sizeof(head));
num=;
}
void addedge(int fr,int to,int flow)
{
edge[num].to=to;
edge[num].flow=flow;
edge[num].nex=head[fr];
head[fr]=num++;
edge[num].to=fr;
edge[num].flow=;
edge[num].nex=head[to];
head[to]=num++;
}
bool bfs()
{
memset(prev,-,sizeof(prev));
prev[st]=;
queue<int>q;
q.push(st);
while(!q.empty())
{
int top=q.front();
q.pop();
for(int i=head[top]; i!=-; i=edge[i].nex)
{
int temp=edge[i].to;
if(prev[temp]==-&&edge[i].flow>)
{
prev[temp]=prev[top]+;
q.push(temp);
}
}
}
return prev[ed]!=-;
}
int dfs(int u,int flow)
{
if(u==ed)
return flow;
int res=;
for(int i=head[u]; i!=-; i=edge[i].nex)
{
int t=edge[i].to;
if(prev[t]==(prev[u]+)&&edge[i].flow>)
{
int temp=dfs(t,min(flow,edge[i].flow));
edge[i].flow-=temp;
edge[i^].flow+=temp;
res+=temp;
flow-=temp;
if(flow==)
break;
}
}
if(res==)
prev[u]=-;
return res;
}
int n,m;
int dinic()
{
int ans=;
while(bfs())
{
ans+=dfs(st,inf);
}
return ans;
}
int cal()
{
int ans=,x,y;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
if (w[i][j] >= ) continue;
int dir = -(w[i][j] + ),Max = w[i][j] = ;
for (int x = i + dx[dir],y = j + dy[dir]; ;)
{
if (x < || x > n || y < || y > m) break;
Max = max(Max,w[x][y]); x += dx[dir]; y += dy[dir];
}
ans += Max;
if (dir <= )
{
addedge(st,A[i][j],inf);
for (int x = i + dx[dir],y = j + dy[dir]; ;)
{
if (x < || x > n || y < || y > m) break;
addedge(A[x - dx[dir]][y - dy[dir]],A[x][y],Max - w[x - dx[dir]][y - dy[dir]]);
x += dx[dir]; y += dy[dir];
}
}
else
{
addedge(B[i][j],ed,inf);
for (int x = i + dx[dir],y = j + dy[dir]; ;)
{
if (x < || x > n || y < || y > m) break;
addedge(B[x][y],B[x - dx[dir]][y - dy[dir]],Max - w[x - dx[dir]][y - dy[dir]]);
x += dx[dir]; y += dy[dir];
}
}
}
return ans;
}
int main()
{
init();
int tot=;
scanf("%d %d",&n,&m);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
A[i][j]=++tot,B[i][j]=++tot;
scanf("%d",&w[i][j]);
addedge(A[i][j],B[i][j],inf);
}
}
st=++tot,ed=++tot;
int sum=cal();
int ans=dinic();
// cout<<sum<<" "<<ans<<endl;
printf("%d\n",sum-ans);
return ;
}

E - tower HYSBZ - 4657 (网络流割点)的更多相关文章

  1. BZOJ 4657 (网络流)

    题面 Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. 攻击方法是:对于 ...

  2. luogu准备复习(学习)题单

    矩阵乘法 P1306 exbsgs P4195 网络流(割点) P1345 主席树 P3302

  3. Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)

    Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...

  4. 【刷题】BZOJ 4657 tower

    Description Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. ...

  5. 【BZOJ4657】tower [网络流]

    炮塔 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output 一行一个整数表示答案. Sample Input 4 5 0 ...

  6. HDU2485Destroying the bus stations 拆点网络流求割点个数

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题目要求:删除最少的点,使得源点到汇点的距离大于k 思路:拆点.建图求费用小于等于k的最大流 # ...

  7. 【BZOJ1585】【Luogu2944】地震损失2(网络流)

    [BZOJ1585][Luogu2944]地震损失2(网络流) 题面 题目描述 Wisconsin has had an earthquake that has struck Farmer John' ...

  8. [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)

    A - ACM Computer Factory 题目描述:某个工厂可以利用P个部件做一台电脑,有N个加工用的机器,但是每一个机器需要特定的部分才能加工,给你P与N,然后是N行描述机器的最大同时加工数 ...

  9. [USACO5.4]奶牛的电信Telecowmunication(网络流)

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

随机推荐

  1. lambda函数对象与作用域 (重点)

    Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时 ...

  2. Application Server not specified

    IDEA使用tomcat启动web项目,配置页面报错Application Server not specified: 那是因为没有配置tomcat,只要配置一下就好了:

  3. MT【213】二次曲线系方程

    (2013北大夏令营)函数$y=x^2+ax+b$与坐标轴交于三个不同的点$A,B,C$,已知$\Delta ABC$的外心$P$在$y=x$上,求$a+b$的值. 解:由二次曲线系知识知三角形的外接 ...

  4. 自学Aruba4.2-Aruba AC基础配置(1)

    点击返回:自学Aruba之路 自学Aruba4.2-Aruba AC基础配置(1) 管理员登陆(admin/saic_admin): Cli Web 管理帐号 控制器基础设置: 控制器恢复出厂设置 查 ...

  5. 洛谷 P1057 传球游戏 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  6. DataFrame 数据去重

    df.head() >>> Price Seqno Symbol time 0 1623.0 0.0 APPL 1473411962 1 1623.0 0.0 APPL 147341 ...

  7. 洛谷P5163 WD与地图

    只有洛谷的毒瘤才会在毒瘤月赛里出毒瘤题...... 题意:三个操作,删边,改变点权,求点x所在强连通分量内前k大点权之和. 解:狗屎毒瘤数据结构乱堆...... 整体二分套(tarjan+并查集) + ...

  8. A1073. Scientific Notation

    Scientific notation is the way that scientists easily handle very large numbers or very small number ...

  9. 利用千人基因组数据库查看SNP在不同地区、国家、洲的频率及个数

    首先,进入千人基因组数据库的网站:https://www.ncbi.nlm.nih.gov/variation/tools/1000genomes/ 如下图所示,在数据库的框框里输入我们感兴趣的SNP ...

  10. SpringMVC接受JSON参数详解及常见错误总结我改

    SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...