【Luogu】P2598狼和羊的故事(最小割转最大流)
最小割水题。入点向白点连边,白点向白点、黑点和空点连边,空点向空点和黑点连边,黑点向黑点和汇点连边。然后跑最大流即可。
话说Fd最近怎么光做水题啊……一点用都没有……qwq
我太菜了,做完一道题就打十来分钟osu……这么颓下去吃枣药丸
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
#include<queue>
#define maxn 10020
#define maxm 200200
using namespace std; int u[]={,,,-,};
int w[]={,,,,-};
int n,m; 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;
} struct Edge{
int next,to,val;
}edge[maxm];
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-; }
inline int calc(int i,int j){ return (i-)*m+j; } bool vis[maxn];
int dfn[maxn];
int list[maxn];
int Start,End; bool bfs(){
memset(vis,,sizeof(vis));
queue<int>q; q.push(Start); vis[Start]=; dfn[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(x==End||val==) return val;
int flow=; vis[x]=;
for(int &i=list[x];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]||edge[i].val==||dfn[to]!=dfn[x]+) continue;
int now=dfs(to,min(val,edge[i].val));
val-=now; edge[i].val-=now; edge[count(i)].val+=now; flow+=now;
if(val<=) break;
}
if(flow!=val) 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 q[][]; int main(){
n=read(),m=read(); End=n*m+;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
q[i][j]=read();
if(q[i][j]!=) q[i][j]=-q[i][j];
if(q[i][j]==) add(Start,calc(i,j),0x7fffffff);
else if(q[i][j]==) add(calc(i,j),End,0x7fffffff);
}
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
int now=calc(i,j);
for(int k=;k<=;++k){
int a=i+u[k],b=j+w[k];
if(a&&b&&a<=n&&b<=m){
int ret=calc(a,b);
if(q[i][j]>=q[a][b]) add(now,ret,);
}
}
}
printf("%d",maxflow());
return ;
}
【Luogu】P2598狼和羊的故事(最小割转最大流)的更多相关文章
- P2598 [ZJOI2009]狼和羊的故事(最小割)
P2598 [ZJOI2009]狼和羊的故事 说真的,要多练练网络流的题了,这么简单的网络流就看不出来... 题目要求我们要求将狼和羊分开,也就是最小割,(等等什么逻辑...头大....) 我们这样想 ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )
显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了 -------------------------------------------------------- ...
- 【BZOJ1412】[ZJOI2009]狼和羊的故事 最小割
[BZOJ1412][ZJOI2009]狼和羊的故事 Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想: ...
- BZOJ1412[ZJOI2009]狼和羊的故事——最小割
题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...
- LG2598/BZOJ1412 「ZJOI2009」狼和羊的故事 最小割
问题描述 LG2598 BZOJ1412 题解 看到要把狼和羊两个物种分开 自然想到最小割. 发现\((x,y)\)可以向上下左右走以获得贡献,所以建边:\((x,y),(x-1,y)\),\((x, ...
- [ZJOI2009] 狼与羊的故事 - 最小割
给定一个\(N \times M\)方格矩阵,每个格子可在\(0,1,2\)中取值.要求在方格的边上进行划分,使得任意联通块内不同时包含\(1\)和\(2\)的格子. ________________ ...
- BZOJ 1412--狼和羊的故事(最小割)
1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3316 Solved: 1664[Submit][St ...
- 【Luogu】P2057善意的投票(最小割转最大流)
题目链接 也算水题一道吧,不过Round1感性理解一下就xjb建了个图,40 Round2仔细分析了一会,理性建了个图,90 然后分析了半天……改大数组就A了…… 从S到所有值为1的点连一条inf的边 ...
- 洛谷 - P2598 - 狼和羊的故事 - 最大流
https://www.luogu.org/problemnew/show/P2598 第一次写这种修篱笆的题目,上次好像晓阳dalao写了一个堵人的.好像还有能改变土地属性的. #include&l ...
随机推荐
- 2017-3-7-lint82single-number
2017-3-7-lint82single-number 在河之洲 算法 小书匠 problem 82single-number/ solution int singleNumber(vector&l ...
- 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 :
1 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 : dlg1.h(23) : error C2065: 'IDD_DIALOG1' : und ...
- Java 可变长参数列表
Java中定义了变长参数,允许在调用方法时传入不定长度的参数. 定义及调用 在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入.上述定义有几个要点需要 ...
- JS实现2,8,10,16进制的相互转换
// 10进制转为16进制 var a=1234567890; console.log(a.toString(16)) //499602d2 // 16进制转为10进制 var num=parseIn ...
- 2018.3.11 Java DEBUG 调试的方法
F5:Step Into:跳进当前执行的方法中 F6:Step Over:跳过该行继续执行 F7:Step Return:从方法中跳出继续执行 F8:Resume:全部运行通过,从调试状态恢复 Ctr ...
- python plt 保存jpg出错
pip install pillow就可以解决
- java基础—线程(二)
一.线程的优先级别
- React动态import()
React动态import() react-router@v4代码分离,推荐的import().这里分享webpack配置和使用方法. 首先安装两个必须的包 cnpm i react-loadable ...
- bash编程之循环控制:
bash编程之循环控制: for varName in LIST; do 循环体 done while CONDITION; do 循环体 done until CONDITION; do 循 ...
- Title Case a Sentence-freecodecamp算法题目
Title Case a Sentence(中单词首字母大写) 要求 确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. 思路 将句子小写化后用.split(& ...