E - tower HYSBZ - 4657 (网络流割点)
题目链接: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 (网络流割点)的更多相关文章
- BZOJ 4657 (网络流)
题面 Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. 攻击方法是:对于 ...
- luogu准备复习(学习)题单
矩阵乘法 P1306 exbsgs P4195 网络流(割点) P1345 主席树 P3302
- Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)
Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...
- 【刷题】BZOJ 4657 tower
Description Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. ...
- 【BZOJ4657】tower [网络流]
炮塔 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output 一行一个整数表示答案. Sample Input 4 5 0 ...
- HDU2485Destroying the bus stations 拆点网络流求割点个数
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题目要求:删除最少的点,使得源点到汇点的距离大于k 思路:拆点.建图求费用小于等于k的最大流 # ...
- 【BZOJ1585】【Luogu2944】地震损失2(网络流)
[BZOJ1585][Luogu2944]地震损失2(网络流) 题面 题目描述 Wisconsin has had an earthquake that has struck Farmer John' ...
- [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)
A - ACM Computer Factory 题目描述:某个工厂可以利用P个部件做一台电脑,有N个加工用的机器,但是每一个机器需要特定的部分才能加工,给你P与N,然后是N行描述机器的最大同时加工数 ...
- [USACO5.4]奶牛的电信Telecowmunication(网络流)
P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...
随机推荐
- iTunes 12.7 没有应用程序选项了,重新安装iTunes 12.6.3
iTunes 12.6.3 下载地址: Mac http://t.cn/RO5rIfE Win 32 http://t.cn/ROtta1T Win64 http://t.cn/ROtta1n 安装好 ...
- BZOJ2199[Usaco2011 Jan]奶牛议会——2-SAT+tarjan缩点
题目描述 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M ...
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- Catenyms POJ - 2337(单词+字典序输出路径)
题意: 就是给出几个单词 看能否组成欧拉回路或路径 当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点 把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...
- UOJ#192. 【UR #14】最强跳蚤
题目链接 http://uoj.ac/problem/192 暑期课第二天 树上问题进阶 具体内容看笔记博客吧 题意 n个节点的树T 边有边权w 求满足(u, v)上所有边权乘积为完全平方数的路径有多 ...
- THUWC2019 摸鱼记
Day1 菜狗选手无人权,衣服没有海星,狗牌手写全糊,餐票不发刷卡,住宿自理宾馆. 人菜没办法. 感受到了自己智商低 不想写了 想原地退役 不知道还要不要走下去
- UVALive - 6439(思维题)
题目链接:https://vjudge.net/contest/241341#problem/F 题目大意:给你一个字符串,你可以用任意单个字符代替其中的一个子串,使它形成一个回文串,要求形成的回文串 ...
- Java中线程池的实现原理-求职必备
jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 初始化线程池(4种) ...
- 决策单调性优化dp
决策单调性: 对于一些dp方程,经过一系列的猜想和证明,可以得出,所有取的最优解的转移点(即决策点)位置是单调递增的. 即:假设f[i]=min(f[j]+b[j]) (j<i) 并且,对于任意 ...
- JAVA8给我带了什么——Optional和CompletableFuture
不管是JAVA,还是.NET.我们常常会看到空异常(NullPointerException).这种异常都是在运行的过程中出现.往往是变量是一个null值.但是你引用这个变量的后继字段或是方法.所以我 ...