【Luogu】P2445动物园(最大流)
题目本身还是比较水的吧……容易发现是最大流套上dinic跑一遍就好了,并不会超时。
比较不偷税的一点是关于某动物的所有目击报告都符合才能连边……qwqqwqqwq
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<queue>
#define maxn 1000
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int u[]={,,,,-};
int w[]={,,,-,}; struct Edge{
int next,to,val;
}edge[maxn*];
int head[maxn],num;
inline void addedge(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
}
inline void add(int from,int to,int val){
addedge(from,to,val);
addedge(to,from,);
} inline int count(int i){ return i&?i+:i-; } int pre[maxn];
int Start,End;
bool vis[maxn];
int dfn[maxn];
int list[maxn]; bool bfs(){
memset(vis,,sizeof(vis)); dfn[Start]=; vis[Start]=;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front(); q.pop();
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]||edge[i].val<=) continue;
vis[to]=; dfn[to]=dfn[from]+;
q.push(to);
}
}
return vis[End];
} int dfs(int x,int val){
if(val==||x==End) return val;
vis[x]=; int flow=;
for(int &i=list[x];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]||dfn[to]!=dfn[x]+||edge[i].val<=) continue;
int now=dfs(to,min(val,edge[i].val));
if(x!=End) pre[to]=x; edge[i].val-=now; edge[count(i)].val+=now; val-=now; flow+=now;
if(val<=) break;
}
if(val!=flow) dfn[x]=-;
return flow;
} inline int maxflow(){
int ans=;
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=Start;i<=End;++i) list[i]=head[i];
int now=dfs(Start,0x7fffffff);
if(now==) break;
ans+=now;
}
return ans;
} int s[maxn][maxn];
char c[maxn];
bool ext[maxn][maxn];
int dis[][][];
int v[maxn];
bool exa[maxn];
int f[maxn][maxn];
int sum[maxn]; struct Node{
int x,y;
}que[maxn]; int main(){
memset(dis,/,sizeof(dis)); int inf=dis[][][];
int n=read();
for(int i=;i<=n;++i){
scanf("%s",c+);
for(int j=;j<=n;++j)
if(c[j]=='*') s[i][j]=;
else s[i][j]=;
}
int p=read(); End=p*+;
for(int i=;i<=p;++i) que[i]=(Node){read(),read()};
for(int i=;i<=p;++i){
add(Start,i,); add(i+p,End,);
queue<Node>q; q.push(que[i]); dis[i][que[i].x][que[i].y]=;
while(!q.empty()){
Node from=q.front(); q.pop();
//printf("%d %d %d<<<<<<<<\n",i,from.x,from.y);
for(int j=;j<;++j){
int nx=from.x+u[j];
int ny=from.y+w[j];
//printf("%d %d %d %d><>\n",nx,ny,s[nx][ny],dis[i][from.x][from.y]);
if(nx<||nx>n||ny<||ny>n||s[nx][ny]||dis[i][nx][ny]!=inf) continue;
dis[i][nx][ny]=dis[i][from.x][from.y]+;
q.push((Node){nx,ny});
}
}
}
for(int i=;i<=p;++i) v[i]=read();
int r=read();
for(int i=;i<=r;++i){
int t=read(),x=read(),y=read(),d=read(); sum[d]++;
for(int j=;j<=p;++j){
//printf("%d %d>>>\n",j,dis[j][x][y]);
int ret=v[d]*t;
if(ret>=dis[j][x][y]) f[j][d]++;
}
}
for(int i=;i<=p;++i)
for(int j=;j<=p;++j)
if(sum[i]==f[j][i]) add(j,i+p,);
maxflow();
for(int i=+p;i<End;++i){
for(int j=head[i];j;j=edge[j].next){
int to=edge[j].to;
if(to==End||edge[j].val==) continue;
printf("%d %d %d\n",i-p,que[to].x,que[to].y);
break;
}
}
return ;
}
【Luogu】P2445动物园(最大流)的更多相关文章
- luogu P3305 [SDOI2013]费用流
题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...
- Luogu P3305 [SDOI2013]费用流 二分 网络流
题目链接 \(Click\) \(Here\) 非常有趣的一个题目. 关键结论:所有的单位费用应该被分配在流量最大的边上. 即:在保证最大流的前提下,使最大流量最小.这里我们采用二分的方法,每次判断让 ...
- 【luogu P2936 [USACO09JAN]全流Total Flow】 题解
题目链接:https://www.luogu.org/problemnew/show/P2936 菜 #include <queue> #include <cstdio> #i ...
- 【luogu P3128 [USACO15DEC]最大流Max Flow】 题解
题目链接:https://www.luogu.org/problemnew/show/P3128 菜 #include <cstdio> #include <cstring> ...
- 【luogu P3376 网络最大流】 模板
题目链接:https://www.luogu.org/problemnew/show/P3376 #include <iostream> #include <cstdio> # ...
- luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)
题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...
- [LUOGU] P3128 [USACO15DEC]最大流Max Flow
题意:一棵树,多次给指定链上的节点加1,问最大节点权值 n个点,n-1条边很容易惯性想成一条链,幸好有样例.. 简单的树剖即可!(划去) 正常思路是树上差分,毕竟它就询问一次.. #include&l ...
- [luogu P2375] [NOI 2014] 动物园
[luogu P2375] [NOI 2014] 动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
随机推荐
- 洛谷 P1880 石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- python爬虫之路——构造URL集
例某网站的URL集是这样的 https://www.555zw.com/book/40/40934/10334793.html https://www.555zw.com/book/40/40934/ ...
- DDOS介绍
DDOS: Data Domain Operating System(DD OS),即数据域操作系统----管理EMC的数据域拷贝存储系统(powers EMC Data Domain dedupli ...
- jQuery如何获取选中单选按钮radio的值
使用jquery获取radio的值,最重要的是掌握jquery选择器的使用,在一个表单中我们通常是要获取被选中的那个radio项的值,所以要加checked来筛选,比如有以下的一些radio项: 1. ...
- sort 与 sorted 区别:
sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值, ...
- PAT (Basic Level) Practise (中文)-1019. 数字黑洞 (20)
http://www.patest.cn/contests/pat-b-practise/1019 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第 ...
- linux下libnet编程 亲自测试可用
linux下libnet编程 亲自测试可用 亲自测试 如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD IPv6 0x86e ...
- Element表单验证(2)
Element表单验证(2) 上篇讲的是async-validator的基本要素,那么,如何使用到Element中以及怎样优雅地使用,就在本篇. 上篇讲到async-validator由3大部分组成 ...
- IntelliJ IDEA 配置 Tomcat 运行web项目
运行前提: 配置好 Java 的运行环境 配置好 Tomcat 安装 IntelliJ IDEA 开始 1.创建项目并配置 关于配置SDK,等建完项目再说 没有配置SDK的话 会出现下面的弹框,点击 ...
- 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
先上两张图: 查看TIME_WAIT和CLOSE_WAIT数的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a ...