【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 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
随机推荐
- 在DataGridView控件中验证数据输入
实现效果: 知识运用: DataGridView控件的公共事件CellValidating //将System.Windows.Forms.DataGridViewCellValidatingEven ...
- Python 进程 线程总结
操作系统的底层是 进程 线程 实现的 进程 操作系统完成系统进程的切换,中间有状态的保存.进程有自己独立的空间,进程多,资源消耗大 进程是最小的资源管理单位 可以理解为盛放线程的容器 线程 线程是最小 ...
- lua拷贝二进制文件的方法
使用lua拷贝二进制文件相比文本文件复杂一点,方法如下 function copyFunc(targetPath,sourcePath) local rf = io.open(sourcePath,& ...
- NSURL初始化失败
服务端给返回的网页加载不出来,仔细一看,url是空的!!为什么呢. 示例: NSString *urlStr = @"http://服务器返回带有汉字的url字符串.com"; N ...
- 【转】嵌入式操作系统VxWorks中TFFS文件系统的构建
时间:2005-02-20 来源:21IC中国电子网 作者:771所加固机工程部 蔡本华 高文炜 关键字:VxWorks TFFS 嵌入式操作系统 文件系统 摘要:目前的嵌入式 ...
- Github使用技巧总结
<config> PyCharm与GitHub配置使用总结 <readme> 在github的readme添加图片 github readme写法 GitHub上README. ...
- 【转】C++后台开发应该读的书
转载自http://www.cnblogs.com/balloonwj/articles/9094905.html 作者 左雪菲 根据我的经验来谈一谈,先介绍一下我的情况,坐标上海,后台开发(也带团队 ...
- Golang 简单 http 代理转发
程序基本实现了对http的完整转发,目前暂不支持https windows需要在设置中的网络>代理设置为手动,并开启代理服务器,填写ip和端口 // httpForward package ma ...
- tempfs详解
致因 在平常工作中,我们经常需要查看Linux服务器磁盘挂载使用情况,可以使用df命令,不知大家注意到没有,我们使用此命令除了会查看到系统盘以及数据盘挂载情况,还会看到一个tmpfs也在挂载. [ro ...
- 如何用 CSS 和 D3 创作一个无尽的六边形空间
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/NBvrWL 可交互视频 此视频是可 ...