题目链接

  题目本身还是比较水的吧……容易发现是最大流套上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动物园(最大流)的更多相关文章

  1. luogu P3305 [SDOI2013]费用流

    题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...

  2. Luogu P3305 [SDOI2013]费用流 二分 网络流

    题目链接 \(Click\) \(Here\) 非常有趣的一个题目. 关键结论:所有的单位费用应该被分配在流量最大的边上. 即:在保证最大流的前提下,使最大流量最小.这里我们采用二分的方法,每次判断让 ...

  3. 【luogu P2936 [USACO09JAN]全流Total Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2936 菜 #include <queue> #include <cstdio> #i ...

  4. 【luogu P3128 [USACO15DEC]最大流Max Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3128 菜 #include <cstdio> #include <cstring> ...

  5. 【luogu P3376 网络最大流】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3376 #include <iostream> #include <cstdio> # ...

  6. luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)

    题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...

  7. [LUOGU] P3128 [USACO15DEC]最大流Max Flow

    题意:一棵树,多次给指定链上的节点加1,问最大节点权值 n个点,n-1条边很容易惯性想成一条链,幸好有样例.. 简单的树剖即可!(划去) 正常思路是树上差分,毕竟它就询问一次.. #include&l ...

  8. [luogu P2375] [NOI 2014] 动物园

    [luogu P2375] [NOI 2014] 动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向 ...

  9. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

随机推荐

  1. SAP数据中心概述

    文章目录 SAP数据中心内部的组成部分 SAP数据中心的安全性 SAP数据中心的绿色运营 SAP云平台编程环境 Jerry的前一篇文章企业数字化转型与SAP云平台介绍了SAP云平台在企业数字化转型中的 ...

  2. Unity中实现全局管理类的几种方式

    (搬运自我在SegmentFault的博客) 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合 ...

  3. [dp]uestc oj E - 菲波拉契数制

    E - 菲波拉契数制 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  4. Python-OpenCV——Image inverting

    通常我们将读入的彩色图转化成灰度图,需要将灰度图反转得到掩码,如何正确快速的得到某个图像的反转图呢? 首先看一种看似很正确的写法,对其中每个像素进行如下处理: img[x,y] = abs(img[x ...

  5. 【转】绝对不要在树莓派上使用无源的HDMI→VGA视频转换器

    http://www.guokr.com/post/521521/ 树莓派由于BCM2835的限制,仅有HDMI和复合视频两种输出形式.所以对于使用VGA显示器的广大用户,HDMI转VGA转换器就成了 ...

  6. 《毛毛虫组》【Alpha】Scrum meeting 2

    第二天 日期:2019/6/15 1.1 今日完成任务情况以及遇到的问题. 今日完成任务情况: (1)对数据库表进行完善及测试: (2)定义Regex类的IsMatch()方法: (3)进行这一模块代 ...

  7. php面试相关

    22.描述一下大流量高并发量网站的解决方案 答: 1.确认服务器硬件是否足够支持当前的流量. 2.使用memcache缓存技术,将动态数据缓存到内存中,动态网页直接调用这些文件,而不必在访问数据库. ...

  8. html5新结构标签

    html5新结构标签 <header>  定义 section 或 page 的页眉,也就是定义头部的标签. <footer> 定义 section 或 page 的页脚. & ...

  9. [译]The Python Tutorial#8. Errors and Exceptions

    [译]The Python Tutorial#Errors and Exceptions 到现在为止都没有过多介绍错误信息,但是已经在一些示例中使用过错误信息.Python至少有两种类型的错误:语法错 ...

  10. leetcode-17-BST

    530. Minimum Absolute Difference in BST Given a binary search tree with non-negative values, find th ...